【问题标题】:Java regex to validate a name用于验证名称的 Java 正则表达式
【发布时间】:2010-07-16 10:39:03
【问题描述】:

验证可以是的名称

约翰、约翰·保罗等

我使用这个正则表达式:

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

但是当我这样做时:

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

匹配失败?

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

那个正则表达式错了吗?

【问题讨论】:

标签: java regex


【解决方案1】:

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

  • 让-卢克·皮卡德
  • 卡米拉·帕克-鲍尔斯
    • 圣女贞德
  • 马特·勒布朗
  • 陈光生(成龙本名)
  • P!nk
  • Love Symbol #2

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

我怀疑你会找到一个可以验证所有种类名称的正则表达式 - 在开始尝试之前获取大量示例数据(最好是真实世界)。

【讨论】:

  • 不要忘记四字形 יהוה‎
【解决方案2】:

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

【讨论】:

    【解决方案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 不匹配。

    【讨论】:

    最近更新 更多