与Java 8正则表达式匹配任何语言的字符串形式

3

我尝试使用Java 8的正则表达式匹配任何语言的字符串

只要包含字母、数字和.-即可。

String s = "בלה בלה";
String pattern= "^[\\p{L}\\p{Digit}_.-]*$";
return s.matches(pattern);

这段代码为什么对合法的希伯来语字符串返回 null?

等一下,你的字符串中有一个空格,但是模式中没有。试试这个:String pattern = "(?U)^[\\w.\\s-]*$" - Wiktor Stribiżew
3
“return null” 意思是返回空值。因为 String#matches() 返回原始的布尔值,所以不会返回 null。 - Lino
1个回答

5
您可以在模式中添加一个空格,并在传递 Pattern.UNICODE_CHARACTER_CLASS 标志时使用 \w 而不是 \p{L}\p{Digit}_
String s = "בלה בלה";
String pattern= "(?U)[\\w\\s.-]*";
System.out.println(s.matches(pattern));
// => true

请见Java示例
由于该模式在String#matches()方法内使用,因此不需要使用 ^ $ 锚点。如果您计划使用模式与Pattern#find()方法一起使用,请像原始代码中一样将模式放在锚点内(" ^(?U)[ \\ w \\ s.-] * $ ")。 模式详细信息
  • (?U) - Pattern.UNICODE_CHARACTER_CLASS 嵌入式修饰符标志,使速记字符类能够识别 Unicode(您可以在此模式下看到 \w 匹配的内容)
  • [\\w\\s.-]* - 零个或多个:
    • \w - 单词字符(字母,数字,_和一些其他字符)
    • \s - 空格
    • . - 一个句点(在字符类内不需要转义)
    • - - 一个连字符(因为它在字符类的末尾,所以不需要转义)

太棒了!我绝对不知道在Java正则表达式中可以转换Unicode搜索。谢谢您。 - Eugene
我有什么遗漏,还是 . 不应该像 \\. 一样转义? - Lino
@Lino 不应该这样。 - Wiktor Stribiżew
@shmosel:不需要使用“^”和“$”,该模式在“.matches()”中使用。 - Wiktor Stribiżew
1
@Lino: . is 不等于 [.] - Wiktor Stribiżew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接