这是我的当前代码:
return str.matches("^[A-Za-z\\-'. ]+");
我希望在Java中使用国际字母,请问如何实现?
谢谢。
这是我的当前代码:
return str.matches("^[A-Za-z\\-'. ]+");
看起来你想要的是匹配所有的字母字符。通常情况下,你可以通过使用 Posix \p{Alpha}
表达式来实现,同时也扩展了你希望允许的标点符号。正如Java 正则表达式文档所说,它只匹配 ASCII。
然而,文档没有清楚地说明的是,你可以让这个类适用于 Unicode 字符。要做到这一点,你需要开启Unicode 字符类匹配。
你可以通过以下两种方式之一来实现:
UNICODE_CHARACTER_CLASS
常量的Pattern
对象:Pattern p = Pattern.compile("^[p{Alpha}\\-'. ]+", UNICODE_CHARACTER_CLASS);
(?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
如果您认为一切都正确,我有两点额外的观点:
我猜您想匹配除了ASCII字母A-Z之外的字母数字字符。您可以使用\p{IsAlphabetic}
Unicode字符类来实现:
return str.matches("^[\\p{IsAlphabetic}\\-'. ]+");
请用以下内容替换该模式:
"^[\\p{L}\\-'. ]+"
\p{L}
包含所有的Unicode字母。
使用正则表达式\P{L}
匹配任何字母(国内或国际)
通过添加[\p{L}&&[^\p{IsLatin}]]
,您可以匹配所有非拉丁字母。
特别是对于希腊语,正则表达式有\p{InGreek}
来匹配希腊字母,有\P{InGreek}
(区别在于大写P)来匹配非希腊字母。
除非你明确说明“国际字母”的含义,否则无法完全回答这个问题,但一般的解决方案是使用命名字符类,通过\p{name}
语法来实现。有许多命名字符类可供选择。其中一些由正则表达式语言定义,另一些由Unicode标准定义。请参考Pattern javadocs获取部分列表,并查阅相关的Unicode标准。