正则表达式中使用Java7添加的Unicode script匹配中文

798 阅读1分钟

正则表达式匹配中文之前一直都用的在正则表达式中指定Unicode编码区间来实现,没有仔细看过Java doc中关于正则表达式的详细描述, 无意间逛到了一个网站Unicode Regular Expressions,里面讲了Unicode script(书写格式)这个东西,再结合查阅的资料,总结下他的用法。

Java7添加的Unicode script支持

在Java正则表达式中使用Unicode script

在正则表达式中指定书写格式时使用的是\p,完整的\p{script=Han}含义是匹配字符串中书写格式为汉字的Unicode字符。Jdk中也定义了Unicode script的枚举类java.lang.Character.UnicodeScript

代码示例

/**
 * 测试Java7对正则表达式的增强功能.
 * 1. 通过Unicode script匹配所有汉字
 * 2. 命名捕获组
 */
@Test
public void testUseUnicodeScriptCaptureChineseCharacter(){
    String target = "235开头的汉字jkl345中间夹的汉字346dsflj";
    /*
         \p{script=han}: 通过指定Unicode字符使用的书写格式获取字符串中所有的汉字
         ?<name>: 命名捕获组, 在捕获组数量较多的情况下可以用有意义的名称来替代纯数字序号
     */
    String regex = "(?<chineseCharacter>\\p{script=han}+)";
	// String regex = "(?<chineseCharacter>\\p{script=" + Character.UnicodeScript.HAN + "}+)";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(target);

    while (matcher.find()) {
        final String groupByIndex = matcher.group(1);
        final String groupByName = matcher.group("chineseCharacter");

        System.out.println(groupByIndex);
        System.out.println(groupByName);
        System.out.println("========");
    }
}

运行结果如下: 运行结果

通过该技巧完成替换

^([\w|\p{script=Han}]+)\s+([\w|\p{script=Han}]+)\s+(?:\s*[\w|\p{script=Han}]*\s*[\w|\p{script=Han}]*\s*)$

核心:[\w|\p{script=Han}]+,匹配字母、数字、中文

image.png