这是我当前的代码:
return str.matches("^[A-Za-z\\-'. ]+");
我希望它包括国际信件。我如何在 Java 中做到这一点?
谢谢。
最佳答案
看来您想要的是匹配所有字母 字符。通常情况下,您可以使用 Posix \p{Alpha}
表达式来做到这一点,并使用您也希望允许的标点符号进行扩展。作为Java Regular Expressions documentation说,它只匹配 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
如果你认为一切都是正确的,我还有两点要补充:
- 原田雅彦 (Masahiko Harada) 由 Ideographic characters 组成.事实上,它们不是字母字符,
- 您想匹配点 (.) 符号。可以,但请考虑匹配Ideographic fullstops
关于带有国际字母的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14636540/