Java正则表达式验证名称

时间:2010-07-16 10:39:03

标签: java regex

验证可以

的名称 约翰,约翰保罗等

我使用这个正则表达式:

String regex = "[A-Z]([a-z]+|\\s[a-z]+)";

但是当我这样做时:

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

比赛失败了吗?

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

这是正则表达式错了吗?

3 个答案:

答案 0 :(得分:6)

验证名称会遇到很多问题 - 有很多不同类型的名称。考虑:

  • Jéan-luc Picard
  • Carmilla Parker-Bowles
    • Joan d'Arc
  • Matt LeBlanc
  • Chan Kong-sang(成龙的真名)
  • 点!NK
  • Love Symbol #2

最简单的方法是让用户输入他们的名字并按原样接受。如果你想将其分解为个性化名称和姓氏,那么我建议你将输入字段分成两个(或更多)部分,或者只是要求“首选名称”或“昵称”字段

我怀疑你会发现一个可以验证所有各种名称的正则表达式 - 在你开始尝试之前获得一大堆样本数据(最好是现实世界)。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

尝试这样的事情:

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

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

参考


原始图案的问题

这是原始模式:

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

扩展此匹配的替换:

[A-Z][a-z]+

或者:

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

这与JohnJ paul匹配,但显然与John Paul不匹配。