Java正则表达式中的国际字符

5

这是我的当前代码:

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

我希望在Java中使用国际字母,请问如何实现?
谢谢。

1
“国际字母”是什么意思? - Smit
获取一个国际键盘? - syb0rg
或者在另一个国家有一位笔友 :-) - Stephen C
你是在询问关于本地化你的应用程序吗? - Lion
5个回答

13

看起来你想要的是匹配所有的字母字符。通常情况下,你可以通过使用 Posix \p{Alpha} 表达式来实现,同时也扩展了你希望允许的标点符号。正如Java 正则表达式文档所说,它只匹配 ASCII。

然而,文档没有清楚地说明的是,你可以让这个类适用于 Unicode 字符。要做到这一点,你需要开启Unicode 字符类匹配。
你可以通过以下两种方式之一来实现:

  1. 通过创建传递UNICODE_CHARACTER_CLASS常量的Pattern对象:
    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}\\-'. ]+") + " ");
}

显然的结果是:

true true true true

如果您认为一切都正确,我有两点额外的观点:

  • 原田雅彦(Masahiko Harada)由 表意文字 组成。实际上它们不是字母字符,
  • 您想匹配点号(.)符号。可以,但请考虑匹配 表意段落结束标志

只是一个小修正。在您的第一个建议中,您忘记了在p前面加上2个反斜杠。 - Lorion

3

我猜您想匹配除了ASCII字母A-Z之外的字母数字字符。您可以使用\p{IsAlphabetic} Unicode字符类来实现:

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

你可以在完整文档中找到更多的Unicode字符类。

2

请用以下内容替换该模式:

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

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


2

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

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

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


0

除非你明确说明“国际字母”的含义,否则无法完全回答这个问题,但一般的解决方案是使用命名字符类,通过\p{name}语法来实现。有许多命名字符类可供选择。其中一些由正则表达式语言定义,另一些由Unicode标准定义。请参考Pattern javadocs获取部分列表,并查阅相关的Unicode标准。


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