我正在尝试验证一些只允许使用拉丁字母的输入。为此,我正在使用下一个正则表达式:
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}
拉丁文字符(脚本)
有什么想法吗?
答案 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);
}