今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏!

  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.List;
  4. import java.util.regex.Pattern;
  5. /**
  6. * 将字符串中的中文和英文都分离出来
  7. * @author ouyangpeng
  8. * @link http://blog.csdn.net/ouyang_peng/
  9. */
  10. public class WordSeg {
  11.  
  12. public static class WordSegEntry {
  13. public String word;
  14. public boolean isEnglish;
  15. public String toString() {
  16. return "[word-->" + word + "\tisEnglish-->" + isEnglish + "]";
  17. }
  18. }
  19. private String raw;
  20.  
  21. public String getRaw() {
  22. return raw;
  23. }
  24.  
  25. public void setRaw(String raw) {
  26. this.raw = raw;
  27. }
  28.  
  29. List<WordSegEntry> segs = new ArrayList<WordSegEntry>();
  30.  
  31. public List<WordSegEntry> getSegs() {
  32. return segs;
  33. }
  34.  
  35. public int getLength() {
  36. int l = 0;
  37. for (WordSegEntry seg : segs) {
  38. l += seg.word.length();
  39. }
  40. return l;
  41. }
  42.  
  43. public int getCNLength() {
  44. int l = 0;
  45. for (WordSegEntry seg : segs) {
  46. if (seg.isEnglish)
  47. continue;
  48. l += seg.word.length();
  49. }
  50. return l;
  51. }
  52.  
  53. public String toString() {
  54. return join(segs, "\r\n") + "\n\n"+"lenOfEnglish=" + getLength() +"\n 中文长度=" + getCNLength();
  55. }
  56.  
  57. public static String join(Collection arr, String sep) {
  58. return join(arr.toArray(new Object[arr.size()]), sep);
  59. }
  60.  
  61. public static String join(Object[] arr, String sep) {
  62. StringBuilder sb = new StringBuilder();
  63. for (int i = 0; i < arr.length; i++) {
  64. sb.append(arr[i]);
  65. if (sep != null && i < arr.length - 1)
  66. sb.append(sep);
  67. }
  68. return sb.toString();
  69. }
  70.  
  71. private static Pattern p = Pattern.compile("\\p{Punct}");
  72.  
  73. public static boolean isPunctuation(char c) {
  74. return p.matcher(String.valueOf(c)).matches()
  75. || ("、,:;。!?\n"
  76. + "{}()〔〕<>〈〉《》[]「」『』〖〗【】\n"
  77. + "@#%*&+=±×÷~-\u2014\u2015_—─━ ̄\u2025…┈┄┅┉┆┇┊┋|\ufe31│┃∥\/\u2215\n"
  78. + "‘’“”"'\u2035′\u301d″\u02ca\u02cb\n"
  79. + "$£¥‰§№°℃\u2109\u2105\n"
  80. + "^ˇ¨`°¤〃\n"
  81. + "♂♀ ¢¤※\u2573\n"
  82. + "\u221f\u2252\u2266\u2267\u22bf∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴\n"
  83. + "☆★○●◎◇◆□■△▲\u25bd\u25bc\u2609\n"
  84. + "〓\u25e2\u25e3\u25e4\u25e5\u2594\u2581\u2582\u2583\u2585\u2587\u2588\u2589\u2593\u258a\u258b\u258c\u258d\u258e\u258f\u2595\n"
  85. + "→←↑↓\u2196\u2197\u2198\u2199\n"
  86. + "\u256d\u256e\u2570\u256f\n"
  87. + "\ufe35\ufe36\ufe39\ufe3a\ufe3f\ufe40\ufe3d\ufe3e\ufe41\ufe42\ufe43\ufe44\ufe3b\ufe3c\ufe37\ufe38\n"
  88. + "\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u3012\n"
  89. + "┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋" + "\n")
  90. .contains(String.valueOf(c));
  91. }
  92.  
  93. public static WordSeg segWord(String input) {
  94. WordSeg wordseg = new WordSeg();
  95. wordseg.setRaw(input);
  96. List<WordSegEntry> segs = wordseg.getSegs();
  97.  
  98. int last_c_is_en_cn = 0;// 1-en,2-cn
  99. int last = 0;
  100.  
  101. for (int i = 0; i < input.length(); i++) {
  102. char c = input.charAt(i);
  103. if (c <= 32) {// invisible chars
  104. if (last_c_is_en_cn == 1) {// en ,break the words
  105. if (i > last) {
  106. WordSegEntry seg = new WordSegEntry();
  107. seg.word = input.substring(last, i);
  108. seg.isEnglish = last_c_is_en_cn == 1;
  109. segs.add(seg);
  110. last = i + 1;
  111. }
  112. }
  113. } else if (isPunctuation(c)) {
  114. if (i > last) {
  115. if (last_c_is_en_cn != 0) {
  116. WordSegEntry seg = new WordSegEntry();
  117. seg.word = input.substring(last, i);
  118. seg.isEnglish = last_c_is_en_cn == 1;
  119. segs.add(seg);
  120. }
  121. }
  122. last = i + 1;
  123. last_c_is_en_cn = 0;
  124. } else if ((Character.isLetter(c) || Character.isDigit(c)) && c < 127) {
  125. // en word
  126. if (last_c_is_en_cn == 2) {
  127. if (i > last) {
  128. WordSegEntry seg = new WordSegEntry();
  129. seg.word = input.substring(last, i);
  130. seg.isEnglish = last_c_is_en_cn == 1;
  131. segs.add(seg);
  132. last = i;
  133. }
  134. }
  135. last_c_is_en_cn = 1;
  136. } else {// cn word
  137. if (last_c_is_en_cn == 1) {
  138. if (i > last) {
  139. WordSegEntry seg = new WordSegEntry();
  140. seg.word = input.substring(last, i);
  141. seg.isEnglish = last_c_is_en_cn == 1;
  142. segs.add(seg);
  143. last = i;
  144. }
  145. }
  146. last_c_is_en_cn = 2;
  147. }
  148. }
  149. if (last < input.length() && last_c_is_en_cn != 0) {
  150. WordSegEntry seg = new WordSegEntry();
  151. seg.word = input.substring(last, input.length());
  152. seg.isEnglish = last_c_is_en_cn == 1;
  153. segs.add(seg);
  154. }
  155. for (WordSegEntry seg : segs)
  156. if (!seg.isEnglish)
  157. seg.word = seg.word.replaceAll("\\s+", "");
  158. return wordseg;
  159. }
  160. }

对工具类进行测试:

  1. class WordSegTest{
  2. public static void main(String[] args) {
  3. System.out.println(WordSeg.segWord(" (欧阳鹏)我的Android进阶之旅{}()〔〕<>〈〉《》博客地址:http://blog.csdn.net/ouyang_peng/article/details/17224229「」『』〖〗【】☆★○●◎◇◆□■△▲@#%*&欢迎大家![]∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴. "));
  4. }
  5. }

得到结果如下:

  1. [word-->欧阳鹏 isEnglish-->false]
  2. [word-->我的 isEnglish-->false]
  3. [word-->Android isEnglish-->true]
  4. [word-->进阶之旅 isEnglish-->false]
  5. [word-->博客地址 isEnglish-->false]
  6. [word-->http isEnglish-->true]
  7. [word-->blog isEnglish-->true]
  8. [word-->csdn isEnglish-->true]
  9. [word-->net isEnglish-->true]
  10. [word-->ouyang isEnglish-->true]
  11. [word-->peng isEnglish-->true]
  12. [word-->article isEnglish-->true]
  13. [word-->details isEnglish-->true]
  14. [word-->17224229 isEnglish-->true]
  15. [word-->欢迎大家 isEnglish-->false]
  16.  
  17. lenOfEnglish=71
  18. 中文长度=17

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

===================================================================================

我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文的更多相关文章

  1. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  2. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  3. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  4. 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

    习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...

  5. Java 开发环境配置--eclipse工具进行java开发

    Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java Cloud Studio ...

  6. JAVA基础学习day18--常用工具类

    一.System 1.1.概述 System 类包含一些有用的类字段和方法.它不能被实例化. 在 System 类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载 ...

  7. JAVA基础学习day17--集合工具类-Collections

    一.Collection简述 1.1.Collection与Collections的区别 Collections是集合的静态工具类 Collection:是集合的顶级接口 二.Sort 2.1.sor ...

  8. 我的Java开发学习之旅------&gt;Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...

  9. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

随机推荐

  1. eclipse启动Tomcat时报错:严重: Exception loading sessions from persistent storage

    我的项目工程是Spring+hibernate+structs  1.0,最近启动tomcat时多次遇到如下异常: 严重: IOException while loading persisted se ...

  2. 【转】又一次线上 OOM 排查经过

    又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时.问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dum ...

  3. [Js]删除数组指定元素

    写在前面 在最近的项目中,有用到js对数组的操作,之前自己几乎没有用到这种方法,这里就记录一下,算是对学到的东西的一种总结吧. 数组对象splice方法 splice() 方法向/从数组中添加/删除项 ...

  4. mysql二进制安装,升级,多实例部署

    目标 理解线上部署考虑的因素 学会编译安装以及二进制安装mysql 学会升级mysql 学会多实例部署mysql数据库 学会合理部署mysql线上库   考虑因素: 版本选择,5.1,5.5还是5.6 ...

  5. 使用charles远程调试iOS移动应用

    做iOS移动应用很多开发者会喜欢抓网络发包.回包来联调服务端借口以及定位其他网络问 题.如果在Windows系统可以使用fiddler来做iOS的远程代理,只要fiddler所在系统与iOS设备同时连 ...

  6. java基础篇5之泛型

    1 泛型的基本应用 //反射方式 指定类型,就不用强转 Construcctor<String> constructor = String.class.getConstructor(Str ...

  7. android listView 滑动载入数据 该数据是服务端获取的

    package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import ja ...

  8. 【APT】NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网

    APT][社工]NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网 前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线, ...

  9. django orm高级查询 F表达式和Q表达式以及分组annotate

    1.关联关系映射及查询1.1django默认开启延迟加载所有多对1和1对1如果不使用select_related(),需要会延迟加载获取到相关对象,因为延迟可能会造成n+1次查询的问题,所以便有了se ...

  10. bzoj1061【NOI2008】志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2740  Solved: 1703 [Submit][id ...