验证可以包含任何字符但来自特定 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}*")
如果您不想在输入中使用控制字符,请使用模式的变体:
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}*)+")
^^^^^^^^^^^^^^^^^^^^^^^^^
我有这个字符串
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}*")
如果您不想在输入中使用控制字符,请使用模式的变体:
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}*)+")
^^^^^^^^^^^^^^^^^^^^^^^^^