尝试验证拉丁字符时出现PatternSyntaxException异常

3

我正在尝试验证一些只允许拉丁字母的输入。为此,我使用以下正则表达式:

public boolean isValidInput(String inputText) {
    return inputText != null && Pattern.matches("\\p{IsLatin}+", inputText);
}

但是当我运行它时,我得到了一个PatternSyntaxException异常:
FATAL EXCEPTION: main
Process: com.test, PID: 27758
java.util.regex.PatternSyntaxException: U_ILLEGAL_ARGUMENT_ERROR
\p{IsLatin}+
    at java.util.regex.Pattern.compileImpl(Native Method)
    at java.util.regex.Pattern.compile(Pattern.java:411)
    at java.util.regex.Pattern.<init>(Pattern.java:394)
    at java.util.regex.Pattern.matches(Pattern.java:424)
    ...

我正在使用Java 8并使用Android SDK 27进行编译。我已经在三个安卓设备上测试了它,分别是安卓6、7和8,在这些设备上运行的结果相同。

我尝试在独立的Java 8程序中运行相同的代码,它可以正常工作。
Android regex doc页面没有说明\p{IsLatin}不受支持。

有关Unicode脚本、块、类别和二进制属性的类
\p{IsLatin} 拉丁字符(脚本)

有什么想法吗?


1
有趣的是,你可以尝试使用\\p{L}(字母)代替\\p{IsL}(是否为拉丁文)。也许应该用"(?u)\\p{IsLatin}+" - Joop Eggen
\p{Latin} 可以使用!非常感谢 Joop :) ..我花了一天时间尝试让它工作.. - David Miguel
1个回答

6
我刚刚在文档中注意到这行文字(感谢@Joop指出):

可以使用可选前缀Is来指定类别:\p{L}和\p{IsL}表示Unicode字母的类别。

看起来,\p{IsLatin}只是\p{Latin}的别名。两者都在本地Java中运行,但只有\p{Latin}适用于Android(尽管Android Studio会将其标记为红色并警告您它是“未知字符类别”)。
因此,现在我的验证方法如下:
public boolean isLatinInput(String inputText) {
    return inputText != null && Pattern.matches("\\p{Latin}+", inputText);
}

好的,category may not mean what you think it does,而 \p{Latin} may not work on all Java versions。这是一个相当不幸的情况。我希望安卓开发者能够解决这个问题。 - arnt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接