Java 名字和姓氏的唯一正则表达式

Java 名字和姓氏的唯一正则表达式,java,regex,string,validation,input,Java,Regex,String,Validation,Input,我有一个单一的输入,用户应该输入姓名。问题是我需要使用checking regEx。有一个需求列表: 名称应以大写字母(而不是空格)开头 不可能有空间堆栈 它有义务支持这些名字和姓氏(所有人都可以写自己的名字)。例如: John Smith and Armirat Bair Hossan 最后一个符号不应该是空格 请帮忙 我有类似正则表达式的自动取款机 ^\\p{L}\\[p{L} ,.'-]+$ 但它拒绝所有的输入,这是不好的 谢谢你帮助我 更新: CORRECT INPUT: "J

我有一个单一的输入,用户应该输入姓名。问题是我需要使用checking regEx。有一个需求列表:

  • 名称应以大写字母(而不是空格)开头
  • 不可能有空间堆栈
  • 它有义务支持这些名字和姓氏(所有人都可以写自己的名字)。例如:

    John Smith
    and
    Armirat Bair Hossan 
    
  • 最后一个符号不应该是空格

  • 请帮忙

    我有类似正则表达式的自动取款机

    ^\\p{L}\\[p{L} ,.'-]+$
    
    但它拒绝所有的输入,这是不好的

    谢谢你帮助我

    更新:

    CORRECT INPUT: 
    "John Smith"
    "Alberto del Muerto"
    
    INCORRECT
    "   John Smith   "
    " John Smith"
    
    试试这个

    ^[A-Z][a-z]+(([\s][A-Z])?[a-z]+){1,2}$
    
    但是使用\\代替\for java

    您可以使用

    ^[\p{Lu}\p{M}][\p{L}\p{M},.'-]+(?: [\p{L}\p{M},.'-]+)*$
    

    参见和

    Java声明:

    if (str.matches("[\\p{Lu}\\p{M}][\\p{L}\\p{M},.'-]+(?: [\\p{L}\\p{M},.'-]+)*")) { ... } 
    // or if (str.matches("\\p{Lu}\\p{M}*+(?:\\p{L}\\p{M}*+|[,.'-])++(?: (?:\\p{L}\\p{M}*+|[,.'-])++)*+")) { ... } 
    
    第一个正则表达式细分:

    • ^
      -字符串的开头(不需要使用
      匹配()
      方法)
    • [\p{Lu}\p{M}]
      -1个Unicode字母(包括预合成的字母,如
      \p{M}
      匹配变音符号和
      \p{Lu}
      匹配任何大写Unicode基字母)
    • [\p{L}\p{M},.-]+
      -匹配一个或多个Unicode字母,a
      '
      -
      (如果有一个字母名称有效,请在此处末尾将
      +
      替换为
      -
    • (?:[\p{L}\p{M},.-]+)*
      -0个或多个
      • -空格
      • [\p{L}\p{M},.-]+
        -1个或多个字符,可以是Unicode字母或逗号、句点、撇号或
        -
    • $
      -字符串结尾(不需要使用
      匹配()
      方法)
    注意:有时,名称包含卷曲撇号,您可以将它们添加到字符类(
    ['']

    第二个正则表达式效率较低,但更准确,因为它只匹配基音后的变音符号。有关匹配Unicode字母的详细信息,请参见:

    要匹配包含任何变音符号的字母,请使用
    \p{L}\p{M}*+


    你打错了:第二个
    \\
    应该在
    p
    前面。 但是,即使这样,也缺少一个尾随空格的检查

    "^\\p{L}[\\p{L} ,.'-]+$"
    
    对于.matches,以下内容就足够了

    "\\p{L}[\\p{L} ,.'-]*[\\p{L}.]"
    
    像“del Rey,Hidalgo”这样的名字不需要大写字母

    此外,我建议只需
    .trim()
    输入;想象一个用户因为一个伪空白而拒绝输入。

    试试这个

    ^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- ']))[A-Za-z- ']{2,}$
    

    外部网站上也提供了此模式的交互功能。

    添加您的问题有效和无效输入的示例请分享您的代码。我想你可以试试。别忘了加上两个反斜杠。这可能会有帮助:^\\p{L}\[p{L},.-]+$强制性注意事项:
    Alberto del Muerto
    不应该是正确的,因为它可以匹配
    \p{M}
    而不检查大写字母。例如:
    “\u0300abc”
    (这是一个分解的
    \abc
    )最详细的答案。@Mariano:我明白,但是有可能在人名的开头出现变音符号吗?我不知道这种情况是否存在。啊!!这是Java,我们可以使用所有格量词:)@Stribizev我不知道,我想是的。但是如果不允许在第一个字母中使用变音符号,那么在第一个字符类中使用
    \p{M}
    就没有意义了,对吗?我添加了第二个选项。这是一样的,但使用所有格量词,不允许在基本字母前出现变音。你能解释一下你的变体吗?我部分无法理解^-字符串[A-Z]的开头-第一个大写字母[A-Z]+-一个或多个小写字母。在([\s][A-Z])之后空格和大写字母以及[a-z]+-一个或多个小写字母。{1,2}-括号中的部分可以是1或2倍(因此名称可以包含2或3个部分)和$-行尾谢谢您的解释
    ^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- ']))[A-Za-z- ']{2,}$