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

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
/**
* 将字符串中的中文和英文都分离出来
* @author ouyangpeng
* @link http://blog.csdn.net/ouyang_peng/
*/
public class WordSeg { public static class WordSegEntry {
public String word;
public boolean isEnglish;
public String toString() {
return "[word-->" + word + "\tisEnglish-->" + isEnglish + "]";
}
}
private String raw; public String getRaw() {
return raw;
} public void setRaw(String raw) {
this.raw = raw;
} List<WordSegEntry> segs = new ArrayList<WordSegEntry>(); public List<WordSegEntry> getSegs() {
return segs;
} public int getLength() {
int l = 0;
for (WordSegEntry seg : segs) {
l += seg.word.length();
}
return l;
} public int getCNLength() {
int l = 0;
for (WordSegEntry seg : segs) {
if (seg.isEnglish)
continue;
l += seg.word.length();
}
return l;
} public String toString() {
return join(segs, "\r\n") + "\n\n"+"lenOfEnglish=" + getLength() +"\n 中文长度=" + getCNLength();
} public static String join(Collection arr, String sep) {
return join(arr.toArray(new Object[arr.size()]), sep);
} public static String join(Object[] arr, String sep) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (sep != null && i < arr.length - 1)
sb.append(sep);
}
return sb.toString();
} private static Pattern p = Pattern.compile("\\p{Punct}"); public static boolean isPunctuation(char c) {
return p.matcher(String.valueOf(c)).matches()
|| ("、,:;。!?\n"
+ "{}()〔〕<>〈〉《》[]「」『』〖〗【】\n"
+ "@#%*&+=±×÷~-\u2014\u2015_—─━ ̄\u2025…┈┄┅┉┆┇┊┋|\ufe31│┃∥\/\u2215\n"
+ "‘’“”"'\u2035′\u301d″\u02ca\u02cb\n"
+ "$£¥‰§№°℃\u2109\u2105\n"
+ "^ˇ¨`°¤〃\n"
+ "♂♀ ¢¤※\u2573\n"
+ "\u221f\u2252\u2266\u2267\u22bf∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴\n"
+ "☆★○●◎◇◆□■△▲\u25bd\u25bc\u2609\n"
+ "〓\u25e2\u25e3\u25e4\u25e5\u2594\u2581\u2582\u2583\u2585\u2587\u2588\u2589\u2593\u258a\u258b\u258c\u258d\u258e\u258f\u2595\n"
+ "→←↑↓\u2196\u2197\u2198\u2199\n"
+ "\u256d\u256e\u2570\u256f\n"
+ "\ufe35\ufe36\ufe39\ufe3a\ufe3f\ufe40\ufe3d\ufe3e\ufe41\ufe42\ufe43\ufe44\ufe3b\ufe3c\ufe37\ufe38\n"
+ "\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"
+ "┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋" + "\n")
.contains(String.valueOf(c));
} public static WordSeg segWord(String input) {
WordSeg wordseg = new WordSeg();
wordseg.setRaw(input);
List<WordSegEntry> segs = wordseg.getSegs(); int last_c_is_en_cn = 0;// 1-en,2-cn
int last = 0; for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c <= 32) {// invisible chars
if (last_c_is_en_cn == 1) {// en ,break the words
if (i > last) {
WordSegEntry seg = new WordSegEntry();
seg.word = input.substring(last, i);
seg.isEnglish = last_c_is_en_cn == 1;
segs.add(seg);
last = i + 1;
}
}
} else if (isPunctuation(c)) {
if (i > last) {
if (last_c_is_en_cn != 0) {
WordSegEntry seg = new WordSegEntry();
seg.word = input.substring(last, i);
seg.isEnglish = last_c_is_en_cn == 1;
segs.add(seg);
}
}
last = i + 1;
last_c_is_en_cn = 0;
} else if ((Character.isLetter(c) || Character.isDigit(c)) && c < 127) {
// en word
if (last_c_is_en_cn == 2) {
if (i > last) {
WordSegEntry seg = new WordSegEntry();
seg.word = input.substring(last, i);
seg.isEnglish = last_c_is_en_cn == 1;
segs.add(seg);
last = i;
}
}
last_c_is_en_cn = 1;
} else {// cn word
if (last_c_is_en_cn == 1) {
if (i > last) {
WordSegEntry seg = new WordSegEntry();
seg.word = input.substring(last, i);
seg.isEnglish = last_c_is_en_cn == 1;
segs.add(seg);
last = i;
}
}
last_c_is_en_cn = 2;
}
}
if (last < input.length() && last_c_is_en_cn != 0) {
WordSegEntry seg = new WordSegEntry();
seg.word = input.substring(last, input.length());
seg.isEnglish = last_c_is_en_cn == 1;
segs.add(seg);
}
for (WordSegEntry seg : segs)
if (!seg.isEnglish)
seg.word = seg.word.replaceAll("\\s+", "");
return wordseg;
}
}

对工具类进行测试:

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

得到结果如下:

[word-->欧阳鹏	isEnglish-->false]
[word-->我的 isEnglish-->false]
[word-->Android isEnglish-->true]
[word-->进阶之旅 isEnglish-->false]
[word-->博客地址 isEnglish-->false]
[word-->http isEnglish-->true]
[word-->blog isEnglish-->true]
[word-->csdn isEnglish-->true]
[word-->net isEnglish-->true]
[word-->ouyang isEnglish-->true]
[word-->peng isEnglish-->true]
[word-->article isEnglish-->true]
[word-->details isEnglish-->true]
[word-->17224229 isEnglish-->true]
[word-->欢迎大家 isEnglish-->false] lenOfEnglish=71
中文长度=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. POJ 3480 John [博弈之Nim 与 Anti-Nim]

    Nim游戏:有n堆石子,每堆个数不一,两人依次捡石子,每次只能从一堆中至少捡一个.捡走最后一个石子胜. 先手胜负:将所有堆的石子数进行异或(xor),最后值为0则先手输,否则先手胜. ======== ...

  2. Android 分享透明图片到微信变黑的问题

    /** * bitmap中的透明色用白色替换 * * @param bitmap * @return */ public static Bitmap changeColor(Bitmap bitmap ...

  3. MFC中 用Static控件做超链接(可以实现变手形、下划线、字体变色等功能)

    1.新建一个基于对话框的工程MyLink,在对话框中拖一个Static控件,ID可改为IDC_SLink. 2.在头文件中添加成员变量: private: CRect m_Rect; CFont* m ...

  4. JVM —— 移除永久代

    近期准备生产环境 JDK 升级到 1.8,本地先升级了下,发现 -XX:PermSize 和 -XX:MaxPermSize 已经失效,取而代之的是一个新的区域 -- Metaspace(元数据区). ...

  5. poj1649 Rescue(BFS+优先队列)

    Rescue Time Limit: 2 Seconds      Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put ...

  6. UML--组件图,部署图

    组件图用于实现代码之间的物理结构,详细来说,就是实现代码交互.通过接口,将不同的软件,程序连接在一起. [理解] 1.组件的定义相当广泛,包含:源码,子系统,动态链接库,Activex控件. 2.组件 ...

  7. mixare的measureText方法在频繁调用时抛出“referencetable overflow max 1024”的解决方式

    这几天在搞基于位置的AR应用,採用了github上两款开源项目: mixare android-argument-reality-framework 这两个项目实现机制大致同样.我选取的是androi ...

  8. 楼梯跳跃代码web

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. 点击出现黑色背景的解决:-webkit-tap-highlight-color:rgba(0,0,0,0)

    在手机上(iphone)点击按钮的时候,屏幕总会闪动一下,这让页面看起来很不友好也不流畅.解决方案加了一句css就解决了: -webkit-tap-highlight-color:rgba(0,0,0 ...

  10. 一步一步实现一个简单的OS(简单的让boot载入setup)

    这次直接写用boot载入setup模块. 文件系统就先不弄了,以后再说, 咱先整个转简单的载入器. 我把软盘引导改成硬盘了,由于硬盘的读扇区函数简单一些. 这里没有做硬盘的mbr区,我认为在如今我的这 ...