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

问题描述 投票:2回答:1

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

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进行编译。我已经在Android 6,7和8的三个设备上进行了测试,结果相同。

我试图在standalone Java 8 program中运行相同的代码,它工作正常。 Android regex doc页面没有说任何不支持\p{IsLatin}的内容。

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

任何的想法?

java android regex
1个回答
3
投票

我刚刚注意到docs中的这一行(感谢@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.