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

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


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

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

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


相关文章
|
29天前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
68 17
|
29天前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
51 13
|
5月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
193 83
|
2月前
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
108 1
|
3月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
59 10
|
3月前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
313 4
|
3月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
58 4
|
3月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
67 1
|
5月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
106 26
|
4月前
|
监控 Java Python
Java 中的正则表达式
正则表达式是Java中强大的文本处理工具,支持灵活的匹配、搜索、替换和验证功能。本文介绍了正则表达式的语法基础及其在Java中的应用,包括字符串匹配、替换、分割及实际场景中的邮箱验证和电话号码提取等示例。通过这些技术,可以显著提高文本处理的效率和准确性。
348 8