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

时间:2015-11-20 13:23:40

标签: java regex string validation input

我有一个输入,用户应输入姓名和姓氏。问题是我需要使用检查regEx。有一个要求清单:

  1. 名称应从大写字母(不是空格)开始
  2. 不能有空间叠加
  3. 它必须支持这些姓名和姓氏(所有人都可以先写下他们的名字/姓名)。例如:

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

  5. 请帮忙,

    ATM我有正则表达式

    ^\\p{L}\\[p{L} ,.'-]+$
    

    但它拒绝所有输入,这是不好的

    感谢您的帮助

    更新:

    CORRECT INPUT: 
    "John Smith"
    "Alberto del Muerto"
    
    INCORRECT
    "   John Smith   "
    " John Smith"
    

4 个答案:

答案 0 :(得分:2)

您可以使用

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

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

请参阅regex demodemo 2

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}*+|[,.'-])++)*+")) { ... } 

第一个正则表达式分解:

  • ^ - 字符串的开头(matches()方法不需要)
  • [\p{Lu}\p{M}] - 1个Unicode字母(包括预先组合的\p{M}符合变音符号,\p{Lu}匹配任何大写 Unicode基本字母)
  • [\p{L}\p{M},.'-]+ - 匹配1个或多个Unicode字母,,.'-(如果1个字母名称有效,则替换{ {1}} +在此末尾)
  • - - 0或更多序列
    • (?: [\p{L}\p{M},.'-]+)* - 空格
    • - 一个或多个Unicode字母或逗号,句号或撇号或[\p{L}\p{M},.'-]+的字符。
  • - - 字符串结尾($方法不需要)

注意:有时,名称包含撇号,您可以将它们添加到字符类(matches())。

第二个正则表达式效率较低但更准确,因为它只能匹配基本字母后的变音符号。查看有关在regular-expressions.info匹配Unicode字母的详细信息:

  

要匹配包含任何变音符号的字母,请使用[‘’]

答案 1 :(得分:2)

试试这个

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

外部网站上还提供了此模式的交互式 Demo

答案 2 :(得分:1)

你犯了一个错字:第二个\\应该在p前面。 然而,即使这样,尾随空格也会缺少检查

"^\\p{L}[\\p{L} ,.'-]+$"

对于.matches,以下就足够了

"\\p{L}[\\p{L} ,.'-]*[\\p{L}.]"

像“del Rey,Hidalgo”这样的名字不需要初始资本。

我还建议简单地.trim()输入;想象用户关于输入被拒绝的虚假空白。

答案 3 :(得分:0)

试试这个

^[A-Z][a-z]+(([\s][A-Z])?[a-z]+){1,2}$

但是使用\\代替\来代替java