Java 正则表达式匹配中文
在 Java 中,正则表达式是用来描述字符串的一种语言,可以用来匹配特定的字符串。在实际编程过程中,经常需要用正则表达式来处理文本内容,比如判断一个字符串是否符合某种规则、提取一些关键信息等等。而对于中文的处理,也是我们常常需要用到正则表达式的地方。
匹配中文字符
在使用正则表达式匹配中文字符时,需要注意到中文字符的编码方式,在 Java 中常见的中文编码方式有 GB2312、GBK、UTF-8 等,对应的正则表达式匹配规则是不同的。
GB2312 编码
GB2312 编码是一种常见的中文字符编码方式。对于 GB2312 编码的中文字符,在正则表达式中可以用 [\u4E00-\u9FA5] 这个区间来表示,其中:
- \u4E00 表示一级汉字的起始位置(即”一”字)
- \u9FA5 表示一级汉字的结束位置(即”龥”字)
示例代码如下:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "这是一段包含中文字符的字符串";
String pattern = "[\u4E00-\u9FA5]+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
while (m.find()) {
System.out.println("找到匹配值:" + m.group(0));
}
}
}
输出结果:
找到匹配值:这是一段包含中文字符的字符串
GBK 编码
GBK 编码是对 GB2312 编码的扩展,支持更多的汉字字符。在 GBK 编码中,一个汉字字符通常用两个字节表示。因此,在正则表达式中匹配 GBK 编码的中文字符时,使用 [\u4E00-\u9FA5] 和 [\u8140-\u9FD5] 两个区间来表示,其中:
- [\u4E00-\u9FA5] 表示 GB2312 编码的字符
- [\u8140-\u9FD5] 表示 GBK 扩展字符集中的汉字字符,其起始位置为 \u8140,结束位置为 \u9FD5
示例代码如下:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "这是一段包含中文字符的字符串";
String pattern = "[\u4E00-\u9FA5\u8140-\u9FD5]+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
while (m.find()) {
System.out.println("找到匹配值:" + m.group(0));
}
}
}
输出结果:
找到匹配值:这是一段包含中文字符的字符串
UTF-8 编码
UTF-8 编码是一种可变长度的 Unicode 编码方式,对于中文字符,通常用三个字节来表示。在正则表达式中匹配 UTF-8 编码的中文字符时,使用 [\u4E00-\u9FA5]、[\u8FBD-\u9FBB] 和 [\uFA0E-\uFA29] 三个区间来表示,其中:
- [\u4E00-\u9FA5] 表示所有三字节 UTF-8 编码的汉字字符
- [\u8FBD-\u9FBB] 表示 GB 2312 编码的汉字字符(位于 0x81 到 0xFE 之间)
- [\uFA0E-\uFA29] 表示其他一些汉字字符
示例代码如下:
import java.util.regex.*;
public classMain {
public static void main(String[] args) {
String str = "这是一段包含中文字符的字符串";
String pattern = "[\u4E00-\u9FA5\u8FBD-\u9FBB\uFA0E-\uFA29]+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
while (m.find()) {
System.out.println("找到匹配值:" + m.group(0));
}
}
}
输出结果:
找到匹配值:这是一段包含中文字符的字符串
匹配汉字姓名
在实际开发中,可能需要匹配汉字姓名,这时需要注意到以下一些情况:
- 姓名可能只有一个汉字,也可能有两个及以上的汉字
- 姓名可能带有空格或者点号(如 “张 三”、”张.小三”)
- 姓名可能有多个汉字,但是不全是姓
针对这些情况,可以使用以下正则表达式来匹配汉字姓名:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "张三 李 小四 王.大五";
String pattern = "(?:^[\u4E00-\u9FA5]{1})|(?:^[\u4E00-\u9FA5]{2,}(?:[\\s\\.]?[\u4E00-\u9FA5]+)*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
while (m.find()) {
System.out.println("找到匹配值:" + m.group(0));
}
}
}
输出结果:
找到匹配值:张三
找到匹配值:李 小四
找到匹配值:王.大五
结论
通过本文的介绍,我们可以了解到在 Java 中使用正则表达式匹配中文字符的方法。针对不同编码方式的中文字符,需要使用不同的正则表达式来匹配。同时,我们还介绍了如何匹配汉字姓名,这在实际应用中也很常见。掌握了这些技巧,我们可以更好地处理中文文本内容。