zoukankan      html  css  js  c++  java
  • 常用工具类

      1 import java.io.*;
      2 import java.util.Collection;
      3 import java.util.Iterator;
      4 import java.util.List;
      5 
      6 /**
      7  * 文本工具类
      8  */
      9 public class TextUtility
     10 {
     11 
     12     /**
     13      * 单字节
     14      */
     15     public static final int CT_SINGLE = 5;// SINGLE byte
     16 
     17     /**
     18      * 分隔符"!,.?()[]{}+=
     19      */
     20     public static final int CT_DELIMITER = CT_SINGLE + 1;// delimiter
     21 
     22     /**
     23      * 中文字符
     24      */
     25     public static final int CT_CHINESE = CT_SINGLE + 2;// Chinese Char
     26 
     27     /**
     28      * 字母
     29      */
     30     public static final int CT_LETTER = CT_SINGLE + 3;// HanYu Pinyin
     31 
     32     /**
     33      * 数字
     34      */
     35     public static final int CT_NUM = CT_SINGLE + 4;// HanYu Pinyin
     36 
     37     /**
     38      * 序号
     39      */
     40     public static final int CT_INDEX = CT_SINGLE + 5;// HanYu Pinyin
     41 
     42     /**
     43      * 中文数字
     44      */
     45     public static final int CT_CNUM = CT_SINGLE + 6;
     46 
     47     /**
     48      * 其他
     49      */
     50     public static final int CT_OTHER = CT_SINGLE + 12;// Other
     51 
     52     public static int charType(char c)
     53     {
     54         return charType(String.valueOf(c));
     55     }
     56 
     57     /**
     58      * 判断字符类型
     59      * @param str
     60      * @return
     61      */
     62     public static int charType(String str)
     63     {
     64         if (str != null && str.length() > 0)
     65         {
     66             if ("零○〇一二两三四五六七八九十廿百千万亿壹贰叁肆伍陆柒捌玖拾佰仟".contains(str)) return CT_CNUM;
     67             byte[] b;
     68             try
     69             {
     70                 b = str.getBytes("GBK");
     71             }
     72             catch (UnsupportedEncodingException e)
     73             {
     74                 b = str.getBytes();
     75                 e.printStackTrace();
     76             }
     77             byte b1 = b[0];
     78             byte b2 = b.length > 1 ? b[1] : 0;
     79             int ub1 = getUnsigned(b1);
     80             int ub2 = getUnsigned(b2);
     81             if (ub1 < 128)
     82             {
     83                 if (ub1 < 32) return CT_DELIMITER; // NON PRINTABLE CHARACTERS
     84                 if (' ' == b1) return CT_OTHER;
     85                 if ('
    ' == b1) return CT_DELIMITER;
     86                 if ("*"!,.?()[]{}+=/\;:|".indexOf((char) b1) != -1)
     87                     return CT_DELIMITER;
     88                 if ("0123456789".indexOf((char)b1) != -1)
     89                     return CT_NUM;
     90                 return CT_SINGLE;
     91             }
     92             else if (ub1 == 162)
     93                 return CT_INDEX;
     94             else if (ub1 == 163 && ub2 > 175 && ub2 < 186)
     95                 return CT_NUM;
     96             else if (ub1 == 163
     97                     && (ub2 >= 193 && ub2 <= 218 || ub2 >= 225
     98                     && ub2 <= 250))
     99                 return CT_LETTER;
    100             else if (ub1 == 161 || ub1 == 163)
    101                 return CT_DELIMITER;
    102             else if (ub1 >= 176 && ub1 <= 247)
    103                 return CT_CHINESE;
    104 
    105         }
    106         return CT_OTHER;
    107     }
    108 
    109     /**
    110      * 是否全是中文
    111      * @param str
    112      * @return
    113      */
    114     public static boolean isAllChinese(String str)
    115     {
    116         return str.matches("[\u4E00-\u9FA5]+");
    117     }
    118     /**
    119      * 是否全部不是中文
    120      * @param sString
    121      * @return
    122      */
    123     public static boolean isAllNonChinese(byte[] sString)
    124     {
    125         int nLen = sString.length;
    126         int i = 0;
    127 
    128         while (i < nLen)
    129         {
    130             if (getUnsigned(sString[i]) < 248 && getUnsigned(sString[i]) > 175)
    131                 return false;
    132             if (sString[i] < 0)
    133                 i += 2;
    134             else
    135                 i += 1;
    136         }
    137         return true;
    138     }
    139 
    140     /**
    141      * 是否全是单字节
    142      * @param str
    143      * @return
    144      */
    145     public static boolean isAllSingleByte(String str)
    146     {
    147         assert str != null;
    148         for (int i = 0; i < str.length(); i++)
    149         {
    150             if (str.charAt(i) >128)
    151             {
    152                 return false;
    153             }
    154         }
    155         return true;
    156     }
    157 
    158     /**
    159      * 把表示数字含义的字符串转成整形
    160      *
    161      * @param str 要转换的字符串
    162      * @return 如果是有意义的整数,则返回此整数值。否则,返回-1。
    163      */
    164     public static int cint(String str)
    165     {
    166         if (str != null)
    167             try
    168             {
    169                 int i = new Integer(str).intValue();
    170                 return i;
    171             }
    172             catch (NumberFormatException e)
    173             {
    174 
    175             }
    176 
    177         return -1;
    178     }
    179     /**
    180      * 是否全是数字
    181      * @param str
    182      * @return
    183      */
    184     public static boolean isAllNum(String str)
    185     {
    186         if (str == null)
    187             return false;
    188 
    189         int i = 0;
    190         /** 判断开头是否是+-之类的符号 */
    191         if ("±+-+-—".indexOf(str.charAt(0)) != -1)
    192             i++;
    193         /** 如果是全角的0123456789 字符* */
    194         while (i < str.length() && "0123456789".indexOf(str.charAt(i)) != -1)
    195             i++;
    196         // Get middle delimiter such as .
    197         if (i > 0 && i < str.length())
    198         {
    199             char ch = str.charAt(i);
    200             if ("·∶:,,..//".indexOf(ch) != -1)
    201             {// 98.1%
    202                 i++;
    203                 while (i < str.length() && "0123456789".indexOf(str.charAt(i)) != -1)
    204                     i++;
    205             }
    206         }
    207         if (i >= str.length())
    208             return true;
    209 
    210         /** 如果是半角的0123456789字符* */
    211         while (i < str.length() && "0123456789".indexOf(str.charAt(i)) != -1)
    212             i++;
    213         // Get middle delimiter such as .
    214         if (i > 0 && i < str.length())
    215         {
    216             char ch = str.charAt(i);
    217             if (',' == ch || '.' == ch || '/' == ch  || ':' == ch || "∶·,./".indexOf(ch) != -1)
    218             {// 98.1%
    219                 i++;
    220                 while (i < str.length() && "0123456789".indexOf(str.charAt(i)) != -1)
    221                     i++;
    222             }
    223         }
    224 
    225         if (i < str.length())
    226         {
    227             if ("百千万亿佰仟%%‰".indexOf(str.charAt(i)) != -1)
    228                 i++;
    229         }
    230         if (i >= str.length())
    231             return true;
    232 
    233         return false;
    234     }
    235 
    236     /**
    237      * 是否全是序号
    238      * @param sString
    239      * @return
    240      */
    241     public static boolean isAllIndex(byte[] sString)
    242     {
    243         int nLen = sString.length;
    244         int i = 0;
    245 
    246         while (i < nLen - 1 && getUnsigned(sString[i]) == 162)
    247         {
    248             i += 2;
    249         }
    250         if (i >= nLen)
    251             return true;
    252         while (i < nLen && (sString[i] > 'A' - 1 && sString[i] < 'Z' + 1)
    253                 || (sString[i] > 'a' - 1 && sString[i] < 'z' + 1))
    254         {// single
    255             // byte
    256             // number
    257             // char
    258             i += 1;
    259         }
    260 
    261         if (i < nLen)
    262             return false;
    263         return true;
    264 
    265     }
    266 
    267     /**
    268      * 是否全为英文
    269      *
    270      * @param text
    271      * @return
    272      */
    273     public static boolean isAllLetter(String text)
    274     {
    275         for (int i = 0; i < text.length(); ++i)
    276         {
    277             char c = text.charAt(i);
    278             if ((((c < 'a' || c > 'z')) && ((c < 'A' || c > 'Z'))))
    279             {
    280                 return false;
    281             }
    282         }
    283 
    284         return true;
    285     }
    286 
    287     /**
    288      * 是否全为英文或字母
    289      *
    290      * @param text
    291      * @return
    292      */
    293     public static boolean isAllLetterOrNum(String text)
    294     {
    295         for (int i = 0; i < text.length(); ++i)
    296         {
    297             char c = text.charAt(i);
    298             if ((((c < 'a' || c > 'z')) && ((c < 'A' || c > 'Z')) && ((c < '0' || c > '9'))))
    299             {
    300                 return false;
    301             }
    302         }
    303 
    304         return true;
    305     }
    306 
    307     /**
    308      * 是否全是分隔符
    309      * @param sString
    310      * @return
    311      */
    312     public static boolean isAllDelimiter(byte[] sString)
    313     {
    314         int nLen = sString.length;
    315         int i = 0;
    316 
    317         while (i < nLen - 1 && (getUnsigned(sString[i]) == 161 || getUnsigned(sString[i]) == 163))
    318         {
    319             i += 2;
    320         }
    321         if (i < nLen)
    322             return false;
    323         return true;
    324     }
    325 
    326     /**
    327      * 是否全是中国数字
    328      * @param word
    329      * @return
    330      */
    331     public static boolean isAllChineseNum(String word)
    332     {// 百分之五点六的人早上八点十八分起床
    333 
    334         String chineseNum = "零○一二两三四五六七八九十廿百千万亿壹贰叁肆伍陆柒捌玖拾佰仟∶·./点";//
    335         String prefix = "几数上第";
    336         String surfix = "几多余来成倍";
    337         boolean round = false;
    338 
    339         if (word == null)
    340             return false;
    341 
    342         char[] temp = word.toCharArray();
    343         for (int i = 0; i < temp.length; i++)
    344         {
    345             if (word.startsWith("分之", i))// 百分之五
    346             {
    347                 i += 1;
    348                 continue;
    349             }
    350             char tchar = temp[i];
    351             if (i == 0 && prefix.indexOf(tchar) != -1)
    352             {
    353                 round = true;
    354             }
    355             else if (i == temp.length-1 && !round && surfix.indexOf(tchar) != -1)
    356             {
    357                 round = true;
    358             }
    359             else if (chineseNum.indexOf(tchar) == -1)
    360                 return false;
    361         }
    362         return true;
    363     }
    364 
    365 
    366     /**
    367      * 得到字符集的字符在字符串中出现的次数
    368      *
    369      * @param charSet
    370      * @param word
    371      * @return
    372      */
    373     public static int getCharCount(String charSet, String word)
    374     {
    375         int nCount = 0;
    376 
    377         if (word != null)
    378         {
    379             String temp = word + " ";
    380             for (int i = 0; i < word.length(); i++)
    381             {
    382                 String s = temp.substring(i, i + 1);
    383                 if (charSet.indexOf(s) != -1)
    384                     nCount++;
    385             }
    386         }
    387 
    388         return nCount;
    389     }
    390 
    391 
    392     /**
    393      * 获取字节对应的无符号整型数
    394      *
    395      * @param b
    396      * @return
    397      */
    398     public static int getUnsigned(byte b)
    399     {
    400         if (b > 0)
    401             return (int) b;
    402         else
    403             return (b & 0x7F + 128);
    404     }
    405 
    406     /**
    407      * 判断字符串是否是年份
    408      *
    409      * @param snum
    410      * @return
    411      */
    412     public static boolean isYearTime(String snum)
    413     {
    414         if (snum != null)
    415         {
    416             int len = snum.length();
    417             String first = snum.substring(0, 1);
    418 
    419             // 1992年, 98年,06年
    420             if (isAllSingleByte(snum)
    421                     && (len == 4 || len == 2 && (cint(first) > 4 || cint(first) == 0)))
    422                 return true;
    423             if (isAllNum(snum) && (len >= 3 || len == 2 && "056789".indexOf(first) != -1))
    424                 return true;
    425             if (getCharCount("零○一二三四五六七八九壹贰叁肆伍陆柒捌玖", snum) == len && len >= 2)
    426                 return true;
    427             if (len == 4 && getCharCount("千仟零○", snum) == 2)// 二仟零二年
    428                 return true;
    429             if (len == 1 && getCharCount("千仟", snum) == 1)
    430                 return true;
    431             if (len == 2 && getCharCount("甲乙丙丁戊己庚辛壬癸", snum) == 1
    432                     && getCharCount("子丑寅卯辰巳午未申酉戌亥", snum.substring(1)) == 1)
    433                 return true;
    434         }
    435         return false;
    436     }
    437 
    438     /**
    439      * 判断一个字符串的所有字符是否在另一个字符串集合中
    440      *
    441      * @param aggr 字符串集合
    442      * @param str  需要判断的字符串
    443      * @return
    444      */
    445     public static boolean isInAggregate(String aggr, String str)
    446     {
    447         if (aggr != null && str != null)
    448         {
    449             str += "1";
    450             for (int i = 0; i < str.length(); i++)
    451             {
    452                 String s = str.substring(i, i + 1);
    453                 if (aggr.indexOf(s) == -1)
    454                     return false;
    455             }
    456             return true;
    457         }
    458 
    459         return false;
    460     }
    461 
    462     /**
    463      * 判断该字符串是否是半角字符
    464      *
    465      * @param str
    466      * @return
    467      */
    468     public static boolean isDBCCase(String str)
    469     {
    470         if (str != null)
    471         {
    472             str += " ";
    473             for (int i = 0; i < str.length(); i++)
    474             {
    475                 String s = str.substring(i, i + 1);
    476                 int length = 0;
    477                 try
    478                 {
    479                     length = s.getBytes("GBK").length;
    480                 }
    481                 catch (UnsupportedEncodingException e)
    482                 {
    483                     e.printStackTrace();
    484                     length = s.getBytes().length;
    485                 }
    486                 if (length != 1)
    487                     return false;
    488             }
    489 
    490             return true;
    491         }
    492 
    493         return false;
    494     }
    495 
    496     /**
    497      * 判断该字符串是否是全角字符
    498      *
    499      * @param str
    500      * @return
    501      */
    502     public static boolean isSBCCase(String str)
    503     {
    504         if (str != null)
    505         {
    506             str += " ";
    507             for (int i = 0; i < str.length(); i++)
    508             {
    509                 String s = str.substring(i, i + 1);
    510                 int length = 0;
    511                 try
    512                 {
    513                     length = s.getBytes("GBK").length;
    514                 }
    515                 catch (UnsupportedEncodingException e)
    516                 {
    517                     e.printStackTrace();
    518                     length = s.getBytes().length;
    519                 }
    520                 if (length != 2)
    521                     return false;
    522             }
    523 
    524             return true;
    525         }
    526 
    527         return false;
    528     }
    529 
    530     /**
    531      * 判断是否是一个连字符(分隔符)
    532      *
    533      * @param str
    534      * @return
    535      */
    536     public static boolean isDelimiter(String str)
    537     {
    538         if (str != null && ("-".equals(str) || "-".equals(str)))
    539             return true;
    540         else
    541             return false;
    542     }
    543 
    544     public static boolean isUnknownWord(String word)
    545     {
    546         if (word != null && word.indexOf("未##") == 0)
    547             return true;
    548         else
    549             return false;
    550     }
    551 
    552     /**
    553      * 防止频率为0发生除零错误
    554      *
    555      * @param frequency
    556      * @return
    557      */
    558     public static double nonZero(double frequency)
    559     {
    560         if (frequency == 0) return 1e-3;
    561 
    562         return frequency;
    563     }
    564 
    565     /**
    566      * 转换long型为char数组
    567      *
    568      * @param x
    569      */
    570     public static char[] long2char(long x)
    571     {
    572         char[] c = new char[4];
    573         c[0] = (char) (x >> 48);
    574         c[1] = (char) (x >> 32);
    575         c[2] = (char) (x >> 16);
    576         c[3] = (char) (x);
    577         return c;
    578     }
    579 
    580     /**
    581      * 转换long类型为string
    582      *
    583      * @param x
    584      * @return
    585      */
    586     public static String long2String(long x)
    587     {
    588         char[] cArray = long2char(x);
    589         StringBuilder sbResult = new StringBuilder(cArray.length);
    590         for (char c : cArray)
    591         {
    592             sbResult.append(c);
    593         }
    594         return sbResult.toString();
    595     }
    596 
    597     /**
    598      * 将异常转为字符串
    599      *
    600      * @param e
    601      * @return
    602      */
    603     public static String exceptionToString(Exception e)
    604     {
    605         StringWriter sw = new StringWriter();
    606         PrintWriter pw = new PrintWriter(sw);
    607         e.printStackTrace(pw);
    608         return sw.toString();
    609     }
    610 
    611     /**
    612      * 判断某个字符是否为汉字
    613      *
    614      * @param c 需要判断的字符
    615      * @return 是汉字返回true,否则返回false
    616      */
    617     public static boolean isChinese(char c)
    618     {
    619         String regex = "[\u4e00-\u9fa5]";
    620         return String.valueOf(c).matches(regex);
    621     }
    622 
    623     /**
    624      * 统计 keyword 在 srcText 中的出现次数
    625      *
    626      * @param keyword
    627      * @param srcText
    628      * @return
    629      */
    630     public static int count(String keyword, String srcText)
    631     {
    632         int count = 0;
    633         int leng = srcText.length();
    634         int j = 0;
    635         for (int i = 0; i < leng; i++)
    636         {
    637             if (srcText.charAt(i) == keyword.charAt(j))
    638             {
    639                 j++;
    640                 if (j == keyword.length())
    641                 {
    642                     count++;
    643                     j = 0;
    644                 }
    645             }
    646             else
    647             {
    648                 i = i - j;// should rollback when not match
    649                 j = 0;
    650             }
    651         }
    652 
    653         return count;
    654     }
    655 
    656     /**
    657      * 简单好用的写String方式
    658      *
    659      * @param s
    660      * @param out
    661      * @throws IOException
    662      */
    663     public static void writeString(String s, DataOutputStream out) throws IOException
    664     {
    665         out.writeInt(s.length());
    666         for (char c : s.toCharArray())
    667         {
    668             out.writeChar(c);
    669         }
    670     }
    671 
    672     /**
    673      * 判断字符串是否为空(null和空格)
    674      *
    675      * @param cs
    676      * @return
    677      */
    678     public static boolean isBlank(CharSequence cs)
    679     {
    680         int strLen;
    681         if (cs == null || (strLen = cs.length()) == 0)
    682         {
    683             return true;
    684         }
    685         for (int i = 0; i < strLen; i++)
    686         {
    687             if (!Character.isWhitespace(cs.charAt(i)))
    688             {
    689                 return false;
    690             }
    691         }
    692         return true;
    693     }
    694 
    695     public static String join(String delimiter, Collection<String> stringCollection)
    696     {
    697         StringBuilder sb = new StringBuilder(stringCollection.size() * (16 + delimiter.length()));
    698         for (String str : stringCollection)
    699         {
    700             sb.append(str).append(delimiter);
    701         }
    702 
    703         return sb.toString();
    704     }
    705 
    706     public static String combine(String... termArray)
    707     {
    708         StringBuilder sbSentence = new StringBuilder();
    709         for (String word : termArray)
    710         {
    711             sbSentence.append(word);
    712         }
    713         return sbSentence.toString();
    714     }
    715 
    716     public static String join(Iterable<? extends CharSequence> s, String delimiter)
    717     {
    718         Iterator<? extends CharSequence> iter = s.iterator();
    719         if (!iter.hasNext()) return "";
    720         StringBuilder buffer = new StringBuilder(iter.next());
    721         while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
    722         return buffer.toString();
    723     }
    724 
    725     public static String combine(Sentence sentence)
    726     {
    727         StringBuilder sb = new StringBuilder(sentence.wordList.size() * 3);
    728         for (IWord word : sentence.wordList)
    729         {
    730             sb.append(word.getValue());
    731         }
    732 
    733         return sb.toString();
    734     }
    735 
    736     public static String combine(List<Word> wordList)
    737     {
    738         StringBuilder sb = new StringBuilder(wordList.size() * 3);
    739         for (IWord word : wordList)
    740         {
    741             sb.append(word.getValue());
    742         }
    743 
    744         return sb.toString();
    745     }
    746 }

    来源:https://github.com/hankcs/HanLP/blob/master/src/main/java/com/hankcs/hanlp/utility/TextUtility.java

  • 相关阅读:
    YARN调度器(Scheduler)详解
    eaysui datagrid编辑时表格变宽变形问题解决
    超简单!两步实现Wordpress评论微信通知~
    基于混合模型的语音降噪效果提升
    无线路由器,86式墙壁路由器,连接时,子路由器不能上网
    vue 动态绑定NavMenu 导航菜单(两级)
    SVN代码迁移至Gitlab(保留日志)
    Spring Boot 获取项目路径或文件
    Spring Boot使用 @Async 注解进行异步调用
    【DVWA】安全测试工具之BurpSuite
  • 原文地址:https://www.cnblogs.com/lxcy/p/9290475.html
Copyright © 2011-2022 走看看