importjava.io.BufferedReader;importjava.io.StringReader;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***@author
*/
public classStrings {/*** 全角轉半角
*
*@paramsbc 全角字符
*@returnString*/
public staticString toDBC(String sbc) {char c[] =sbc.toCharArray();for (int i = 0; i < c.length; i++) {if (c[i] == '\u3000')
c[i]= ' ';else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
c[i]= (char) (c[i] - 65248);
}return newString(c);
}/*** 判斷是否為空或 null值
*
*@paramstr String
*@returntrue or false*/
public static booleannullOrEmpty(String str) {if (str == null)return true;
String trim=trim(str);return trim.length() == 0 || "null".equals(trim.toLowerCase());
}/*** 去除String前后空格和全角空格
*
*@paramstr 要處理的String
*@paramsmb 自定義無效字符
*@return去空格的String*/
public static String trim(String str, char...smb) {int len =str.length();int st = 0;char[] val =str.toCharArray();while ((st < len) && (val[st] <= ' ' || val[st] == ' '|| containsChar(smb, val[st]))) st++;while ((st < len) && (val[len - 1] <= ' ' || val[len - 1] == ' ')) len--;return ((st > 0) || (len < str.length())) ?str.substring(st, len) : str;
}private static boolean containsChar(char[] cs, charc) {if (cs.length > 0)for (chars : cs)if (c ==s)return true;return false;
}/*** 封裝正則表達式命中的值
*
*@paramstr 源字符串
*@parampattern 正則
*@returnOptional*/
public static Listgroup(String str, String pattern) {returngroup(str, Pattern.compile(pattern));
}public static Listgroup(String str, Pattern pattern) {
Matcher matcher=pattern.matcher(str);
List group = new ArrayList<>();while(matcher.find()) {
group.add(matcher.group());
}returngroup;
}/*** 凈長: 全角字符算2
*
*@paramstr 字符串
*@returnint*/
public static intnetLength(String str) {int length = 0;for (int i = 0; i < str.length(); i++) {char c =str.charAt(i);
length+=charLength(c);
}returnlength;
}public static int charLength(charc) {return ((int)c) >= 256 ? 2 : 1;
}public static booleanisNumber(String str) {
Pattern pattern= Pattern.compile("^[-+]?[\\d]*$");return str != null &&pattern.matcher(str).matches();
}/*** 字符串轉阿拉伯數字
*
*@paramstr 字符串
*@returnlong類型阿拉伯數字
*@since2018.1.26*/
public static longtoArabic(String str) {long result = 0;int buffer = 0, ch = 0;
StringBuilder back= newStringBuilder();boolean backSwitch = true;for (charc : str.toCharArray()) {int i = 0;if (c > 47 && c < 58) {
ch= c - 48;
}else if (c > 65295 && c < 65306) {
ch= c - 65296;
}else{//noinspection StatementWithEmptyBody
while (NUMBER_CHAR[i] != c && ++i
while (UNIT_CHAR[j] != c && ++j
backSwitch= false;if (j < 2) {
result+= (buffer + ch) *UNIT_NUMBER[j];
buffer= 0;
}else{if (ch == 0)
ch= 1;
buffer+= ch *UNIT_NUMBER[j];
ch= 0;
}
}else{
ch=NUMBER[i];
}
}if(backSwitch)
back.append(ch);
}if (nullOrEmpty(back.toString())) return 0L;return backSwitch ? Long.parseLong(back.toString()) : result + buffer +ch;
}public static doublesimilar(String str1, String str2) {/** 先移除無意義字符,再比較長短,否則
* 如果長串中無效字符過多會出現 ArrayIndexOutOfBoundsException*/String newStrA=removeSign(str1);
String newStrB=removeSign(str2);if (newStrA.length()
String temps=newStrA;
newStrA=newStrB;
newStrB=temps;
}returnlongestCommonSubstring(newStrA, newStrB);
}/*** 將字符串的所有數據依次寫成一行*/
private staticString removeSign(String str) {
StringBuilder sb= newStringBuilder();for (charitem : str.toCharArray()) {if(charReg(item)) {
sb.append(item);
}
}returnsb.toString();
}/*** 判斷字符是否為漢字,數字和字母,
* 因為對符號進行相似度比較沒有實際意義,故符號不加入考慮范圍。*/
private static boolean charReg(charcharValue) {return (charValue >= 0x4E00 && charValue <= 0X9FA5) || (charValue >= 'a' && charValue <= 'z')|| (charValue >= 'A' && charValue <= 'Z') || (charValue >= '0' && charValue <= '9');
}/*** 求公共子串,采用動態規劃算法。
* 其不要求所求得的字符在所給的字符串中是連續的。*/
private static doublelongestCommonSubstring(String strA, String strB) {char[] chars_strA =strA.toCharArray();char[] chars_strB =strB.toCharArray();int m =chars_strA.length;int n =chars_strB.length;/** 初始化矩陣數據,matrix[0][0]的值為0,
* 如果字符數組chars_strA和chars_strB的對應位相同,則matrix[i][j]的值為左上角的值加1,
* 否則,matrix[i][j]的值等于左上方最近兩個位置的較大值,
* 矩陣中其余各點的值為0.*/
int[][] matrix = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (chars_strA[i - 1] == chars_strB[j - 1]) {
matrix[i][j]= matrix[i - 1][j - 1] + 1;
}else{
matrix[i][j]= Math.max(matrix[i][j - 1], matrix[i - 1][j]);
}
}
}return matrix[m][n] * 1.0 /strA.length();
}private static final char[] NUMBER_CHAR = {'〇', '零', '一', '兩', '二', '三', '四', '五', '六', '七', '八', '九'};private static final char[] UNIT_CHAR = {'億', '萬', '千', '百', '十'};private static final long[] UNIT_NUMBER = {100000000, 10000, 1000, 100, 10};private static final int[] NUMBER = {0, 0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9};
}