验证可以包含任何字符但来自特定 alphabet/script 的字母的字符串

Validate a string that can contain any characters, but letters from a specific alphabet/script

我有这个字符串

String s = "Some text, some text!"

我需要检查字符串,如果这个字符串有来自其他语言的字符,比如希伯来语或俄语,那么 return false,否则如果字符串只有英文字符(可选空格和标点)return 真的。当然像这样 String s = ", , ." 的字符串必须 return false.

我正在尝试此代码

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

但它 return false

我做错了什么?已经花了很多时间寻找答案,谁能帮忙?

要匹配仅包含 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]]* - 除了 ASCII 字母之外的 0 个或更多可打印的 ASCII 字符(&&[^...] 是一个 字符 class 减法 ,它在这里用于使模式更快、更有效地工作)
  • [A-Za-z] - ASCII 字母 (=\p{Alpha})
  • [ -~]* - 0 个或多个可打印的 ASCII 字符。

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

附加信息

如果您需要匹配仅包含某些 script/alphabet 个字母和字符串中任何其他字符的字符串,您可以使用

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

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

现在,假设你只想匹配一个字符串,它的字母只能是希伯来字母。由于 \p{InHebrew} 包含所有希伯来文字,而不仅仅是字母,因此您可以使用此 class 的 交叉点 和字母 \p{L} class , [\p{InHebrew}&&[\p{L}]]:

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