5

这是我当前的代码:

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

我希望它包括国际信件。我如何在 Java 中做到这一点?

谢谢。

4

5 回答 5

13

看来你想要的是,匹配所有的字母字符。通常,您会使用 Posix\p{Alpha}表达式来做到这一点,并通过您希望也允许的标点符号进行扩展。正如Java 正则表达式文档所说,它只匹配 ASCII。

但是,文档没有明确说明的是,您可以使此类使用 Unicode 字符。为此,您需要打开Unicode 字符类匹配。
您可以通过以下两种方式之一执行此操作:

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

概念证明:

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

明显的结果是:

真的 真的 真的 真的

如果您认为一切都是正确的,我还有两点要说明:

  • 原田雅彦(原田正彦)由表意文字组成。实际上它们不是字母字符,
  • 您想要匹配点 (.) 符号。没关系,但请考虑匹配表意句号
于 2013-02-02T13:00:00.700 回答
3

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

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

您会在完整文档中找到更多 Unicode 字符类。

于 2013-01-31T22:52:19.633 回答
2

将模式替换为:

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

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

于 2013-01-31T22:59:45.310 回答
2

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

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

特别是对于希腊语,正则表达式必须\p{InGreek}匹配希腊字母并且\P{InGreek}(区别是大写 P)匹配非希腊字母。

于 2016-07-22T09:22:58.643 回答
0

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

于 2013-01-31T23:00:46.617 回答