验证可以包含任何字符但特定字母/脚本中的字母的字符串

时间:2018-10-12 13:00:02

标签: java regex posix

我有这个字符串

String s = "Some text, some text!"

我需要检查字符串,并且如果该字符串具有其他语言的字符,例如希伯来语或俄语,则返回false,否则返回false,否则,如果字符串仅具有英语char(带空格和点数的可选字符),则返回true。像这样的String s = ", , ."字符串必须返回false。

我尝试过此代码

Pattern pEng = Pattern.compile("\\p{Alpha}+\\p{Space}*\\p{Punct}*\\p{Digit}*");
pEng.matcher(s).matches()

但返回false

我做错了什么?已经花了很多时间寻找答案,谁可以提供帮助?

1 个答案:

答案 0 :(得分:1)

要匹配仅包含ASCII字符且具有至少一个ASCII字母的字符串,可以使用

s.matches("[\\p{ASCII}&&[^A-Za-z]]*[A-Za-z]\\p{ASCII}*")

请参见this Java demo

如果您不想在输入中允许使用控制字符,请使用模式的变体:

s.matches("[ -~&&[^A-Za-z]]*[A-Za-z][ -~]*")

请参见this Java demo

请注意,.matches需要完整的字符串匹配,因此,无需在模式周围添加^$ / \z锚点。

模式详细信息

  • [ -~&&[^A-Za-z]]*-0个或更多可打印的ASCII字符,但ASCII字母除外(&&[^...]字符类减法,在这里可以使模式更快,更有效地工作)
  • [A-Za-z]-ASCII字母(= \p{Alpha}
  • [ -~]*-0个或更多可打印的ASCII字符。

\p{ASCII} Unicode属性类与任何ASCII字符匹配。

其他信息

如果您只需要将字符串与某些脚本/字母和字符串中的其他字符匹配,则可以使用

s.matches("\\P{L}*(?:[A-Za-z]\\P{L}*)+")

[A-Za-z]用于英语,对于俄语,您将使用[а-яА-ЯёЁ]

现在,假设您只想匹配一个字符串,该字符串的字母只能是希伯来字母。由于\p{InHebrew}包含所有希伯来语脚本,而不仅仅是字母,因此您将使用此类的 intersection 和字母\p{L}[\p{InHebrew}&&[\p{L}]]

str.matches("\\P{L}*(?:[\\p{InHebrew}&&[\\p{L}]]\\P{L}*)+")
                       ^^^^^^^^^^^^^^^^^^^^^^^^^