我尝试使用Java 8的正则表达式匹配任何语言的字符串
只要包含字母、数字和.
或-
即可。
String s = "בלה בלה";
String pattern= "^[\\p{L}\\p{Digit}_.-]*$";
return s.matches(pattern);
这段代码为什么对合法的希伯来语字符串返回 null?
Pattern.UNICODE_CHARACTER_CLASS
标志时使用 \w
而不是 \p{L}\p{Digit}_
:String s = "בלה בלה";
String pattern= "(?U)[\\w\\s.-]*";
System.out.println(s.matches(pattern));
// => true
String#matches()
方法内使用,因此不需要使用 ^
和 $
锚点。如果您计划使用模式与Pattern#find()
方法一起使用,请像原始代码中一样将模式放在锚点内(" ^(?U)[ \\ w \\ s.-] * $ "
)。
模式详细信息:
(?U)
- Pattern.UNICODE_CHARACTER_CLASS
嵌入式修饰符标志,使速记字符类能够识别 Unicode(您可以在此模式下看到 \w
匹配的内容)[\\w\\s.-]*
- 零个或多个:
\w
- 单词字符(字母,数字,_
和一些其他字符)\s
- 空格.
- 一个句点(在字符类内不需要转义)-
- 一个连字符(因为它在字符类的末尾,所以不需要转义)
String pattern = "(?U)^[\\w.\\s-]*$"
。 - Wiktor StribiżewString#matches()
返回原始的布尔值,所以不会返回 null。 - Lino