这是我当前的代码:
return str.matches("^[A-Za-z\\-'. ]+");
我希望它包括国际信件。我如何在 Java 中做到这一点?
谢谢。
这是我当前的代码:
return str.matches("^[A-Za-z\\-'. ]+");
我希望它包括国际信件。我如何在 Java 中做到这一点?
谢谢。
看来你想要的是,匹配所有的字母字符。通常,您会使用 Posix\p{Alpha}
表达式来做到这一点,并通过您希望也允许的标点符号进行扩展。正如Java 正则表达式文档所说,它只匹配 ASCII。
但是,文档没有明确说明的是,您可以使此类使用 Unicode 字符。为此,您需要打开Unicode 字符类匹配。
您可以通过以下两种方式之一执行此操作:
Pattern
传递UNICODE_CHARACTER_CLASS
常量的对象: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}\\-'. ]+") + " ");
}
明显的结果是:
真的 真的 真的 真的
如果您认为一切都是正确的,我还有两点要说明:
我假设您想要匹配 ASCII 字母 AZ 以外的字母数字字符。您可以使用\p{IsAlphabetic}
Unicode 字符类执行此操作:
return str.matches("^[\\p{IsAlphabetic}\\-'. ]+");
您会在完整文档中找到更多 Unicode 字符类。
将模式替换为:
"^[\\p{L}\\-'. ]+"
\p{L}
包括所有 unicode 字母。
使用正则表达式\P{L}
匹配任何字母(国内或国际)
通过添加[\p{L}&&[^\p{IsLatin}]]
,您可以匹配所有非拉丁字母。
特别是对于希腊语,正则表达式必须\p{InGreek}
匹配希腊字母并且\P{InGreek}
(区别是大写 P)匹配非希腊字母。
除非您说出“国际字母”的意思,否则无法完全回答这个问题,但一般的解决方案是通过\p{name}
语法使用命名字符类。有许多命名的字符类。有些是由正则表达式语言定义的,有些是由 Unicode 标准定义的。有关部分列表,请参阅Pattern javadocs,以及相关的 Unicode 标准。