我有这个字符串
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
我做错了什么?已经花了很多时间寻找答案,谁可以提供帮助?
答案 0 :(得分:1)
要匹配仅包含ASCII字符且具有至少一个ASCII字母的字符串,可以使用
s.matches("[\\p{ASCII}&&[^A-Za-z]]*[A-Za-z]\\p{ASCII}*")
如果您不想在输入中允许使用控制字符,请使用模式的变体:
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}*)+")
^^^^^^^^^^^^^^^^^^^^^^^^^