Java正则表达式用于验证名称

3
为了验证可以使用的姓名,例如John, John Paul等,我使用以下正则表达式:
String regex = "[A-Z]([a-z]+|\\s[a-z]+)";

但是当我这样做时:

boolean ok = Pattern.matches(regex, "John Paul");

匹配失败了?

为什么?我想使用匹配来验证整个字符串...

这个正则表达式有问题吗?


请参考 https://dev59.com/D3VC5IYBdhLWcg3wfxQ8 获取匹配姓名的正则表达式。 - Kai Sternad
3个回答

6
您将会在验证名称方面遇到很多问题 - 有很多不同类型的名称。例如:
- Jéan-luc Picard - Carmilla Parker-Bowles - Joan d'Arc - Matt LeBlanc - Chan Kong-sang (成龙的真名) - P!nk - Love Symbol #2
最简单的方法是让用户输入他们的名称并接受原样输入。如果您想要将其拆分为个人姓名和姓氏以进行个性化等方面,则建议将输入字段拆分为两个或更多部分,或者仅询问“首选姓名”或“昵称”字段。
我怀疑您会找到一个可以验证所有各种名称的正则表达式 - 在开始尝试之前,请获得大量的样本数据(最好是现实世界中的数据)。

不要忘记四字神名 יהוה‎。 - polygenelubricants

4

Paul的首字母是大写字母P,你的正则表达式不允许第二个单词以大写字母开头。


3

可以尝试以下方法:

[A-Z][a-z]+( [A-Z][a-z]+)?

?是可选部分,用于匹配姓氏。这将在第一组中捕获姓氏(带有前导空格)。如果您不需要此捕获,则可以使用非捕获组(?:...)

参考资料


原始模式存在的问题

以下是原始模式:

[A-Z]([a-z]+|\s[a-z]+)

扩展此匹配的交替:

[A-Z][a-z]+

或者:

[A-Z]\s[a-z]+

这个匹配包括JohnJ paul,但显然不包括John Paul


Rubular:原始模式http://www.rubular.com/r/brGWN77bma和建议的模式http://www.rubular.com/r/DWM2pNGfR2 - polygenelubricants

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