package com.opslab.util; import com.opslab.util.algorithmImpl.BCConvert; import com.opslab.util.algorithmImpl.StringImpl; import java.text.DecimalFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 提供些常用的字符串相关的工具方法 */ public final class StringUtil { /** * 判断是否是空字符串 null和"" 都返回 true * * @param str 判断的字符串 * @return 是否有效 */ public static boolean isEmpty(String str) { return str == null || str.equals(""); } /** * 把string array or list用给定的符号symbol连接成一个字符串 * * @param list 需要处理的列表 * @param symbol 链接的符号 * @return 处理后的字符串 */ public static String joinString(List list, String symbol) { String result = ""; if (list != null) { for (Object o : list) { String temp = o.toString(); if (temp.trim().length() > 0) result += (temp + symbol); } if (result.length() > 1) { result = result.substring(0, result.length() - 1); } } return result; } /** * 判定第一个字符串是否等于的第二个字符串中的某一个值 * * @param str1 测试的字符串 * @param str2 字符串数组(用,分割) * @return 是否包含 */ public static boolean requals(String str1, String str2) { if (str1 != null && str2 != null) { str2 = str2.replaceAll("\\s*", ""); String[] arr = str2.split(","); for (String t : arr) { if (t.equals(str1.trim())) { return true; } } } return false; } /** * 判定第一个字符串是否等于的第二个字符串中的某一个值 * * @param str1 测试的字符串 * @param str2 字符串数组 * @param split str2字符串的分隔符 * @return 是否包含 */ public static boolean requals(String str1, String str2, String split) { if (str1 != null && str2 != null) { str2 = str2.replaceAll("\\s*", ""); String[] arr = str2.split(split); for (String t : arr) { if (t.equals(str1.trim())) { return true; } } } return false; } /** * 字符串省略截取 * 字符串截取到指定长度size+...的形式 * * @param subject 需要处理的字符串 * @param size 截取的长度 * @return 处理后的字符串 */ public static String subStringOmit(String subject, int size) { if (subject != null && subject.length() > size) { subject = subject.substring(0, size) + "..."; } return subject; } /** * 截取字符串 超出的字符用symbol代替 * * @param str 需要处理的字符串 * @param len 字符串长度 * @param symbol 最后拼接的字符串 * @return 测试后的字符串 */ public static String subStringSymbol(String str, int len, String symbol) { String temp = ""; if (str != null && str.length() > len) { temp = str.substring(0, len) + symbol; } return temp; } /** * 把string array or list用给定的符号symbol连接成一个字符串 * * @param array 需要处理的字符串数组 * @param symbol 链接的符号 * @return 处理后的字符串 */ public static String joinString(String[] array, String symbol) { String result = ""; if (array != null) { for (String temp : array) { if (temp != null && temp.trim().length() > 0) result += (temp + symbol); } if (result.length() > 1 && valid.valid(symbol)) { result = result.substring(0, result.length() - symbol.length()); } } return result; } /** * 将一组字符才以指定的字符链接起来 * @param linkStr 链接字符 * @param strs 需要连接的动态参数 * @return */ public static String join(String linkStr,String ... strs){ StringBuffer result = new StringBuffer(); for (String temp : strs) { if (temp != null && temp.trim().length() > 0) result.append(temp + linkStr); } if (result.length() > 1 && valid.valid(linkStr)) { return result.substring(0, result.length() - linkStr.length()); } return result.toString(); } /** * 隐藏邮件地址前缀。 * * @param email - EMail邮箱地址 例如: ssss@koubei.com 等等... * @return 返回已隐藏前缀邮件地址, 如 *********@koubei.com. */ public static String getHideEmailPrefix(String email) { if (null != email) { int index = email.lastIndexOf('@'); if (index > 0) { email = repeat("*", index).concat(email.substring(index)); } } return email; } /** * repeat - 通过源字符串重复生成N次组成新的字符串。 * * @param src - 源字符串 例如: 空格(" "), 星号("*"), "浙江" 等等... * @param num - 重复生成次数 * @return 返回已生成的重复字符串 */ public static String repeat(String src, int num) { StringBuilder s = new StringBuilder(); for (int i = 0; i < num; i++) s.append(src); return s.toString(); } /** * 截取字符串左侧的Num位截取到末尾 * * @param str1 处理的字符串 * @param num 开始位置 * @return 截取后的字符串 */ public static String ltrim(String str1, int num) { String tt = ""; if (!isEmpty(str1) && str1.length() >= num) { tt = str1.substring(num, str1.length()); } return tt; } /** * 截取字符串右侧第0位到第Num位 * * @param str 处理的字符串 * @param num 截取的位置 * @return 截取后的字符串 */ public static String rtrim(String str, int num) { if (!isEmpty(str) && str.length() > num) { str = str.substring(0, str.length() - num); } return str; } /** * 根据指定的字符把源字符串分割成一个list * * @param src 处理的字符串 * @param pattern 分割字符串 * @return 处理后的list */ public static List<String> parseString2List(String src, String pattern) { List<String> list = new ArrayList<>(); if (src != null) { String[] tt = src.split(pattern); list.addAll(Arrays.asList(tt)); } return list; } /** * 格式化一个float * * @param format 要格式化成的格式 such as #.00, #.# * @return 格式化后的字符串 */ public static String formatDouble(double f, String format) { DecimalFormat df = new DecimalFormat(format); return df.format(f); } /** * 截取字符串左侧指定长度的字符串 * * @param input 输入字符串 * @param count 截取长度 * @return 截取字符串 */ public static String left(String input, int count) { if (isEmpty(input)) { return ""; } count = (count > input.length()) ? input.length() : count; return input.substring(0, count); } /** * 截取字符串右侧指定长度的字符串 * * @param input 输入字符串 * @param count 截取长度 * @return 截取字符串 * Summary 其他编码的有待测试 */ public static String right(String input, int count) { if (isEmpty(input)) { return ""; } count = (count > input.length()) ? input.length() : count; return input.substring(input.length() - count, input.length()); } /** * 全角字符变半角字符 * * @param str 需要处理的字符串 * @return 处理后的字符串 */ public static String full2Half(String str) { if(isEmpty(str)){ return ""; } return BCConvert.qj2bj(str); } /** * 半角字符变全角字符 * @param str 需要处理的字符串 * @return 处理后的字符串 */ public static String Half2Full(String str){ if(isEmpty(str)){ return ""; } return BCConvert.bj2qj(str); } /** * 页面中去除字符串中的空格、回车、换行符、制表符 * * @param str 需要处理的字符串 */ public static String replaceBlank(String str) { if (str != null) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(str); str = m.replaceAll(""); } return str; } /** * 判断字符串数组中是否包含某字符串元素 * * @param substring 某字符串 * @param source 源字符串数组 * @return 包含则返回true,否则返回false */ public static boolean isIn(String substring, String[] source) { if(isEmpty(substring) || !valid.valid(source)){ return false; } for (String t:source) { if (substring.equals(t)) { return true; } } return false; } /** * 字符串转换unicode.实现native2ascii.exe类似的功能 * * @param string 需要处理的字符串 */ public static String string2Unicode(String string) { StringBuilder uni = new StringBuilder(); for (int i = 0; i < string.length(); i++) { String temp ="\\u"+String.valueOf(Integer.toHexString(string.charAt(i))); uni.append(temp); } return uni.toString(); } /** * 转字符串 实现native2ascii.exe类似的功能 * * @param unicode 需要处理的字符串 */ public static String unicode2String(String unicode) { StringBuilder str = new StringBuilder(); String[] hex = unicode.split("\\\\u"); for (int i = 1; i < hex.length; i++) { int data = Integer.parseInt(hex[i], 16); str.append((char) data); } return str.toString(); } /** * 删除所有的标点符号 * * @param str 处理的字符串 */ public static String trimPunct(String str) { if(isEmpty(str)){ return ""; } return str.replaceAll("[\\pP\\p{Punct}]", ""); } /** * 字符串相似度比较(速度较快) */ public static double SimilarityRatio(String str1, String str2) { str1 = StringUtil.trimPunct(str1); str2 = StringUtil.trimPunct(str2); if (str1.length() > str2.length()) { return StringImpl.SimilarityRatio(str1, str2); } else { return StringImpl.SimilarityRatio(str2, str1); } } /** * 字符串相似度比较(速度较快) */ public static double SimilarDegree(String str1, String str2) { str1 = StringUtil.trimPunct(str1); str2 = StringUtil.trimPunct(str2); if (str1.length() > str2.length()) { return StringImpl.SimilarDegree(str1, str2); } else { return StringImpl.SimilarDegree(str2, str1); } } /** * 获取字符串str在String中出现的次数 * * @param string 处理的字符串 * @param str 子字符串 */ public static int countSubStr(String string, String str) { if ((str == null) || (str.length() == 0) || (string == null) || (string.length() == 0)) { return 0; } int count = 0; int index = 0; while ((index = string.indexOf(str, index)) != -1) { count++; index += str.length(); } return count; } /** * 替换一个出现的子串 * * @param s source string * @param sub substring to replace * @param with substring to replace with */ public static String replaceFirst(String s, String sub, String with) { int i = s.indexOf(sub); if (i == -1) { return s; } return s.substring(0, i) + with + s.substring(i + sub.length()); } /** * 替换最后一次出现的字串 * Replaces the very last occurrence of a substring with supplied string. * * @param s source string * @param sub substring to replace * @param with substring to replace with */ public static String replaceLast(String s, String sub, String with) { int i = s.lastIndexOf(sub); if (i == -1) { return s; } return s.substring(0, i) + with + s.substring(i + sub.length()); } /** * 删除所有的子串 * Removes all substring occurrences from the string. * * @param s source string * @param sub substring to remove */ public static String remove(String s, String sub) { int c = 0; int sublen = sub.length(); if (sublen == 0) { return s; } int i = s.indexOf(sub, c); if (i == -1) { return s; } StringBuilder sb = new StringBuilder(s.length()); do { sb.append(s.substring(c, i)); c = i + sublen; } while ((i = s.indexOf(sub, c)) != -1); if (c < s.length()) { sb.append(s.substring(c, s.length())); } return sb.toString(); } /** * 将字符串首字母转大写 * @param str 需要处理的字符串 */ public static String upperFirstChar(String str){ if(isEmpty(str)){ return ""; } char[] cs=str.toCharArray(); if((cs[0] >= 'a') && (cs[0] <= 'z')){ cs[0] -= (char) 0x20; } return String.valueOf(cs); } /** * 将字符串首字母转小写 * @param str * @return */ public static String lowerFirstChar(String str){ if(isEmpty(str)){ return ""; } char[] cs=str.toCharArray(); if((cs[0] >= 'A') && (cs[0] <= 'Z')){ cs[0] += (char) 0x20; } return String.valueOf(cs); } /** * 判读俩个字符串右侧的length个字符串是否一样 * @param str1 * @param str2 * @param length * @return */ public static boolean rigthEquals(String str1,String str2,int length){ return right(str1,length).equals(right(str2,length)); } /** * 判读俩个字符串左侧的length个字符串是否一样 * @param str1 * @param str2 * @param length * @return */ public static boolean leftEquals(String str1,String str2,int length){ return left(str1,length).equals(left(str2,length)); } }