package edu.fudan.nlp.cn; import java.util.TreeSet; import java.util.regex.Pattern; /** * 中文字符操作类 * @author xpqiu * @version 1.0 * @since FudanNLP 1.5 */ public class Chars { /** * 字符类型 * 汉字 字母 数字 标点 :空格; * @author xpqiu * */ public enum CharType { /** * 汉字 */ C, /** * 字母 */ L, /** * 数字 */ D, /** * 标点 */ P, /** * 空格 */ B } /** * 字符串类型 */ public enum StringType{ /** * 纯数字 */ D, /** * 纯字母 */ L, /** * 纯汉字 */ C, /** * 混合字符串 */ M, /** * 空格 */ B, /** * 其他,例如标点等 */ O } /** * 半角或全角数字英文 * * @param str * @return 0,1 * @see Chars#isChar(char) */ public static boolean isChar(String str) { for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (isChar(c)) return false; } return true; } /** * 是否包含半角或全角数字英文 * * @param str * @return 0,1 * @see Chars#isChar(char) */ public static boolean containChar(String str) { for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (isChar(c)) return true; } return false; } /** * 半角或全角数字英文 * @param c * @return */ public static boolean isChar(char c) { return Character.isDigit(c)||Character.isLowerCase(c)||Character.isUpperCase(c); } /** * 是否为中文字符 * @param c * @return */ public static boolean isChineseChar(char c) { if (c > 65280 && c < 65375) return true; else return false; } /** * 全角转半角 * * @param input * 全角或半角字符串 * @return 半角字符串 */ public static String ToDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 12288) { c[i] = (char) 32; continue; } if (c[i] > 65280 && c[i] < 65375) c[i] = (char) (c[i] - 65248); } return new String(c); } /** * 将字符类型转换为字符串类型 * 须和Chars#getStringType(String)保持一致 * @param c * @return * @see Chars#getStringType(String) */ public static StringType char2StringType(CharType c) { switch(c){ case D: return StringType.D; case C: return StringType.C; case L: return StringType.L; case B: return StringType.B; default: return StringType.O; } } /** * 得到字符串类型 * @param str * @return * @see Chars#char2StringType(CharType) */ public static StringType getStringType(String str) { TreeSet<CharType> set = getTypeSet(str); if(set.size()==1){ CharType c = set.first(); return char2StringType(c); } return StringType.M; } /** * 得到字符串中所有出现的字符类型集合 * @param str * @return */ public static TreeSet<CharType> getTypeSet(String str) { CharType[] tag = getType(str); TreeSet<CharType> set = new TreeSet<CharType>(); for(int i=0;i<tag.length;i++){ set.add(tag[i]); } return set; } private static boolean isCharType(CharType[] ct, CharType CT) { for(int i = 0; i < ct.length; i++) { if(ct[i] != CT) return false; } return true; } public static boolean isLetterOrDigitOrPunc(char ch) { int i = Character.getType(ch); return Character.isLowerCase(ch) || Character.isUpperCase(ch) || Character.isDigit(ch) || (i>=20&&i<=30); //TODO:可以修改为Java7中的isLetterOrDigit } static Pattern PattLDP = Pattern.compile("(\\w|\\pP|\\pS|\\s)+"); public static boolean isLetterOrDigitOrPunc(String str) { return PattLDP.matcher(str).matches(); //TODO:可以修改为Java7中的isLetterOrDigit } /** * * @param str * @return */ public static boolean isPunc(String str) { return PattP.matcher(str).matches(); //TODO:可以修改为Java7中的isLetterOrDigit } /** * 判断字符中每个字符的类型 * * @param str 字符串 * @see Chars#getType(char) */ public static CharType[] getType(String str) { CharType[] tag = new CharType[str.length()]; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); tag[i] = getType(c); } return tag; } static Pattern PattP = Pattern.compile("\\pP|\\pS"); /** * 判断字符类型 * @param c 字符 * @return */ public static CharType getType(char c) { CharType tag; int type = Character.getType(c); if (Character.isLowerCase(c)||Character.isUpperCase(c)){ tag = CharType.L; } else if (c == 12288 || c == 32) {//Character.isWhitespace(c) || Character.isSpaceChar(c) tag = CharType.B; } else if (Character.isDigit(c)) { tag = CharType.D; // }else if ("一二三四五六七八九十零〇○".indexOf(c) != -1) { // tag[i] = CharType.NUM; } else if (type>=20&&type<=30){ // punP.matcher(String.valueOf(c)).matches()){//"/—-()。!,\"'()!,””<>《》::#@¥$%^…&*!、.%". tag = CharType.P; } else { tag =CharType.C; } return tag; } /** * * * * @param str * @return 字符类型序列 */ public static String getTypeString(String str) { CharType[] tag = getType(str); String s = type2String(tag); return s; } public static String type2String(CharType[] tag) { StringBuilder sb = new StringBuilder(); for(int i=0;i<tag.length;i++){ sb.append(tag[i]); if(i<tag.length-1) sb.append(' '); } return sb.toString(); } /** * 判断字符串是否全为空格 * @param w * @return */ public static boolean isWhiteSpace(String w) { for(int i=0;i<w.length();i++){ char c = w.charAt(i); if(!Character.isWhitespace(c)){ return false; } } return true; } }