【问题标题】:PatternSyntaxException when trying to validate Latin characters尝试验证拉丁字符时出现 PatternSyntaxException
【发布时间】:2017-12-21 10:17:05
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 有趣,你可以试试\\p{L}(字母)而不是\\p{IsL}(拉丁文)。也许"(?u)\\p{IsLatin}+".
  • \p{Latin} 有效!非常感谢 Joop :) ..我花了一天时间试图让它工作..

标签: java android regex


【解决方案1】:

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

可以使用可选前缀 Is: Both \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);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2022-01-22
  • 2020-03-04
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多