首页 > 解决方案 > 我正在尝试匹配日文字符的 Unicode 范围,但它会引发 PatternSyntaxException

问题描述

我正在尝试使用 String 类中的 String.matches(String regex) 方法根据这篇文章为某些日文字符块匹配正则表达式。

但是范围正则表达式[\\x3041-\\x3096]和属性正则表达式\p{Hiragana}都会抛出 PatternSyntaxException。我的 IDE 也推荐属性,但似乎没有推荐使用日文字符。

引发此错误的代码是:

c.matches( "[\x3041-\x3096]" )

StackTrace 是:

[\x3041-\x3096]
           ^
    at java.base/java.util.regex.Pattern.error(Pattern.java:2015)
    at java.base/java.util.regex.Pattern.range(Pattern.java:2813)
    at java.base/java.util.regex.Pattern.clazz(Pattern.java:2701)
    at java.base/java.util.regex.Pattern.sequence(Pattern.java:2126)
    at java.base/java.util.regex.Pattern.expr(Pattern.java:2056)
    at java.base/java.util.regex.Pattern.compile(Pattern.java:1778)
    at java.base/java.util.regex.Pattern.<init>(Pattern.java:1427)
    at java.base/java.util.regex.Pattern.compile(Pattern.java:1068)
    at java.base/java.util.regex.Pattern.matches(Pattern.java:1173)
    at java.base/java.lang.String.matches(String.java:2024)
    at lib.UIE.TextInput.valid(TextInput.java:49)

标签: javaregex

解决方案


对于属性正则表达式,请尝试\p{IsHiragana}改用。Is前缀用于区分 unicode 脚本和类别与使用In前缀的块。

更新\x3041因为@VGR 在原始帖子中提到 \x 与 java 无关,\u3041应改为使用。

    Pattern.matches("\\p{IsHiragana}", "ど"); //true
    Pattern.matches("[\u3041-\u3096]", "ど"); //true

Unicode 支持 - Oracle Java 教程


推荐阅读