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

时间:2017-12-21 10:17:06

标签: java android regex

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

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}拉丁文字符(脚本)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我刚刚注意到docs中的这一行(感谢@Joop指出它):

  

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

似乎\p{IsLatin}只是\p{Latin}的别名。两者都在本机Java中工作,但只有\p{Latin} 适用于Android (尽管Android Studio会将其突出显示为红色,并警告您这是一个&#34;未知字符类别&#34;)。

所以现在我的验证方法如下:

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