带有国际字母的Java正则表达式

时间:2013-01-31 22:45:02

标签: java regex internationalization

这是我目前的代码:

return str.matches("^[A-Za-z\\-'. ]+");

我希望它包含国际信件。我如何用Java做到这一点?

感谢。

5 个答案:

答案 0 :(得分:11)

似乎您想要匹配所有字母字符。通常情况下,您可以使用Posix \p{Alpha}表达式,通过您想要允许的标点符号进行扩展。正如Java Regular Expressions documentation所述,它仅与ASCII匹配。

但是,什么文档没有说清楚,你可以使这个类使用Unicode字符。要做到这一点,你需要打开 Unicode字符类匹配 您可以通过以下两种方式之一完成此操作:

  1. 通过创建Pattern对象传递UNICODE_CHARACTER_CLASS常量:
    Pattern p = Pattern.compile("^[p{Alpha}\\-'. ]+", UNICODE_CHARACTER_CLASS);
  2. 使用(?U)嵌入模式标志:
    str.matches("^(?U)[\\p{Alpha}\\-'. ]+");
  3. 概念证明:

    String[] test = {"Jean-Marie Le'Blanc", "Żółć", "Ὀδυσσεύς", "原田雅彦"};
    for (String str : test) {
        System.out.print(str.matches("^(?U)[\\p{Alpha}\\-'. ]+") + " ");
    }
    

    显而易见的结果是:

      

    true true true true

    如果您认为一切正确,我还有两点要做:

答案 1 :(得分:3)

我假设您要匹配ASCII字母A-Z以外的字母数字字符。您可以使用\p{IsAlphabetic} Unicode字符类执行此操作:

return str.matches("^[\\p{IsAlphabetic}\\-'. ]+");

你会发现更多的Unicode字符类full documentation

答案 2 :(得分:1)

将图案替换为:

"^[\\p{L}\\-'. ]+"

\p{L}包含所有unicode字母。

答案 3 :(得分:1)

使用正则表达式\P{L}匹配任何字母(国内或国际)

通过添加[\p{L}&&[^\p{IsLatin}]],您可以匹配所有非拉丁字母。

特别是对于希腊语,正则表达式\p{InGreek}匹配希腊字母和\P{InGreek}(差异为大写字母P)以匹配非希腊字母。

答案 4 :(得分:0)

除非你用“国际字母”说出你的意思,否则这个问题无法完全回答,但一般的解决办法是通过\p{name}语法使用命名的字符类。有许多命名的字符类。一些是由正则表达式语言定义的,另一些是由Unicode标准定义的。有关部分列表和相关的Unicode标准,请参阅Pattern javadocs