代码之家  ›  专栏  ›  技术社区  ›  Humpton

名称的正则表达式

  •  23
  • Humpton  · 技术社区  · 17 年前

    无论如何我分别处理名字和姓氏,但目前使用相同的正则表达式。到目前为止,我已经:

    ^[A-Z][a-zA-Z]+$  
    

    • 连字符名称(沃辛顿-斯迈思)
    • 带撇号的姓名(D'Angelo)
    • 联合名称(Ben&Jerry)

    也许还有别的方法可以让我不去想一个名字,但我怀疑如果我能改变我的想法,我可以加上它。我敢肯定,在某些情况下,不止一种情况会出现在同一个名称中。

    23 回复  |  直到 15 年前
        1
  •  49
  •   Glenn    11 年前

    这个正则表达式非常适合我。

    ^([ \u00c0-\u01ffa-zA-Z'\-])+$
    

    它可以在使用preg_match()的php环境中正常工作,但并不适用于任何地方。

    相配 Jérémie O'Co-nor

        2
  •  45
  •   Matthew Scharley    17 年前

    将-添加到第二个字符类中。最简单的方法是在开始时添加它,这样就不可能将其解释为范围修饰符(如中所示) a-z

    ^[A-Z][-a-zA-Z]+$
    • 带撇号的姓名(D'Angelo)

    ^[A-Z][-'a-zA-Z]+$

    ^[A-Z]'?[-a-zA-Z]+$

    这将允许在第二个位置使用单撇号。

    • 有空格(Van der Humpton)的名字——中间的大写字母(可能或不需要)在这个阶段超出了我的兴趣。

    ^[A-Z]'?[- a-zA-Z]+$

    一个可能更好的方法可能是:

    ^[A-Z]'?[- a-zA-Z]( [a-zA-Z])*$

    在结尾处寻找额外的单词。如果您试图在一个额外的文本体中匹配名称,这可能不是一个好主意,但是,同样,原始文本也不会做得那么好。

    • 联合名称(Ben&Jerry)

    现在你不再看单一的名字了?

    无论如何,正如你所看到的,正则表达式有一个快速增长的习惯。。。

        3
  •  13
  •   Taher Ahmed    11 年前

    名称的最佳正则表达式:

    • 我会用这个词 请参阅以下三个字符:
      1. -
      2. 连字符
      3. 点 .
    • 空格和特殊字符不能在一行中出现两次(例如: -- 或 )
    • 修剪(前后无空格)

    必须使用单个名称,不带空格,不带特殊字符:

    ^([A-Za-z])+$
    
    • 是有效的,, 杰克·亚历山大 奥尼尔 无效(具有特殊字符)

    具有 特殊字符:

    ^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
    
    • 齿状山脊 是有效的,, 奥尼尔 是有效的,, 杰克·亚历山大 无效(有空格)

    强制单名, 可选附加名称 具有 带有特殊字符的空格:

    ^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
    
    • 杰克·亚历山大 塞拉·奥尼尔 有效

    可选附加名称 空间, 没有

    ^[A-Za-z]+((\s)?([A-Za-z])+)*$
    
    • 杰克·亚历山大 是有效的,, 无效(具有特殊字符)

    特例

    许多现代智能设备在每个单词的末尾添加空格,因此在我的应用程序中,我在字符串前后允许无限数量的空格,然后在后面的代码中对其进行修剪。因此,我使用以下方法:

    ^(\s)*[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*(\s)*$
    

    如果您希望添加自己的特殊字符,让我们使用下划线 _ 这是您需要更新的组:

    (\'|\-|\.)
    

    (\'|\-|\.|\_)
    

    PS:如果您有任何问题,请在此处发表评论,我将收到一封电子邮件并回复;)

        4
  •  6
  •   eyelidlessness    17 年前

    虽然我同意你的回答,说你基本上不能用regex做这件事,但我要指出,一些反对意见(国际化字符)可以通过使用UTF字符串和 \p{L} 字符类(与unicode“字母”匹配)。

        5
  •  4
  •   VirtuosiMedia    17 年前

    我真的没有太多东西可以添加到一个处理名称的正则表达式中,因为这里已经有一些很好的建议,但是如果您想了解更多有关正则表达式的信息,请查看:

        6
  •  4
  •   tk_ Collin Price    5 年前

    看看这个:

    ^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$
    

    regex

    here : https://regex101.com/r/mS9gD7/46

        7
  •  3
  •   Domchi    17 年前

    我赞成“放弃”的建议。即使你考虑数字、连字符、撇号等,一些[AZ-Z-Z ]仍然不能赶上国际名字(例如,那些有,或西里尔字母,或汉字……)

    但是你为什么还要验证名字?你想抓住什么错误?你不认为人们比你更懂得写自己的名字吗说真的,通过验证姓名,你唯一能做的就是用不寻常的姓名激怒人们。

        8
  •  3
  •   Jonathan Leffler    17 年前

    基本上,我同意保罗。。。你总会发现例外,比如 卡普里奥酒店 魔王

    消息备注:在PHP中,ereg通常被视为过时(缓慢、不完整)而支持preg(PCRE正则表达式)。
    你应该试试正则表达式测试器,比如强大的 Regex Coach

    如果你真的需要解决你的问题,并且对以上的答案不满意,就直接问吧,我会试试的。

        9
  •  3
  •   uke    15 年前

    这对我很有用:

     +[a-z]{2,3} +[a-z]*|[\w'-]*
    

    让-克劳德·范达姆

    纳丁·阿罗约·罗德里克斯

    贝弗利·德安吉洛

    比利·鲍伯·桑顿

    蒂托·普恩特

    苏珊·德尔里奥

    它将包括“范达姆”、“阿罗约·罗德里克斯”、“德安吉洛”、“比利·鲍勃”等,以及“韦恩”等单数名字。

    我写这篇文章是为了解析MapReduce应用程序的名称。我只想从name字段中提取单词,将del foo、la bar和billy bobs组合成一个单词,以使键值对生成更准确。

        10
  •  1
  •   Robert Gamble    17 年前
    ^[A-Z][a-zA-Z '&-]*[A-Za-z]$ 
    

    将接受以大写字母开头,后跟零个或多个字母、空格、连字符、符号或撇号,并以字母结尾的任何内容。

        11
  •  1
  •   Community Mohan Dere    9 年前

    有关“名称检测”相关内容,请参见此问题。

    regex to match a maximum of 4 spaces

    如果您仍然将自己限制在没有·和其他类似非严格ascii字符的单词中。

    为自己准备一份UTF32字符表的副本,并了解其中有多少个字符 数以百万计的

        12
  •  1
  •   sth    15 年前

    要在用户名中添加多个点,请使用此正则表达式:

    ^[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_\.]*$
    

    字符串长度可以单独设置。

        13
  •  1
  •   Pat Kelly    15 年前

    然后对照你的正则表达式检查。

        14
  •  1
  •   McDowell rahul gupta    14 年前

    /([\u00c0-\u01ffa-zA-Z'\-]+[ ]?[*]?[\u00c0-\u01ffa-zA-Z'\-]*)+/;

    试试这个。您还可以强制使用^以char开头,使用^以char结尾$

        15
  •  1
  •   paviktherin    14 年前

    我也遇到过同样的问题,就像许多其他人发表的文章一样,这不是一个100%的傻瓜式表达,但它对我们有用。

    /([\-'a-z]+\s?){2,4}/
    

    这将检查名字和/或姓氏中是否有任何连字符和/或撇号,以及名字和姓氏之间是否有空格。最后一部分是一个小魔术,可以检查2到4个名字。如果你有很多国际用户,他们可能有5个甚至6个名字,你可以把他们的名字改成5个或6个,这应该适合你。

        16
  •  1
  •   majestic    12 年前

    要改进daan的答案:

    ^([\u00c0-\u01ffa-zA-Z]+\b['\-]{0,1})+\b$
    

    仅允许在a-z和有效的unicode字符中出现一次连字符或撇号。

    还执行回溯以确保字符串末尾没有连字符或撇号。

        17
  •  1
  •   Aman Godara    5 年前

    ^[A-Z][a-z]*(([,.] |[ '-])[A-Za-z][a-z]*)*(\.?)( [IVXLCDM]+)?$

    有关详细信息,请访问 THIS 邮递此正则表达式不允许使用符号AND。

        18
  •  0
  •   Osama Al-Maadeed    17 年前

    我不认为你能用正则表达式做到这一点,你不能用正则表达式轻易地从一段文本中检测出名字,你需要一个认可名字的字典,并在此基础上进行搜索。任何不在列表中的名字都不会被检测到。

        19
  •  0
  •   user669677 user669677    14 年前

    我使用了这个,因为名称可以是文件补丁的一部分。

    //http://support.microsoft.com/kb/177506
    foreach(array('/','\\',':','*','?','<','>','|') as $char)
      if(strpos($name,$char)!==false)
          die("Not allowed char: '$char'");
    
        20
  •  0
  •   atif1512    12 年前

        21
  •  0
  •   doncadavona    11 年前

    我提出了一种用于名称的正则表达式模式:

    /^([a-zA-Z]+[\s'.]?)+\S$/
    

    它起作用了。我想你也应该用它。

    沙基尔·奥尼尔·阿姆斯特朗·巴兹·奥尔德林博士

    它不会匹配具有2个或更多空格的字符串,例如:

    约翰·保罗

    上面的文本有一个结尾空格。尝试高亮显示或选择文本以查看空格

    RegExr: Leanr, Build and Test RegEx

        22
  •  0
  •   Benjamin    11 年前

    祝您有个美好的一天!

        23
  •  0
  •   Aominé    9 年前

    ^[a-zA-Z'-]{3,}\s[a-zA-Z'-]{3,}$
    

    ^ 字符串的开头

    $ 结束

    \s 空间

    [a-zA-Z'-\s]{3,} ' 或 - 喜欢 jean-luc


    如果有多个名字,您可以添加一个 \

    ^[a-zA-Z'-\s]{3,}\s[a-zA-Z'-]{3,}$
    
        24
  •  0
  •   Jakub Brzezinski    5 年前

    下面的正则表达式对于专有名称(城镇、城市、名字、姓氏)简单而有用,允许所有国际字母省略基于unicode的正则表达式引擎。

    ^(?:(?!^\s|[ \-']{2}|[\d\r\n\t\f\v!"#$%&()*+,\.\/:;<=>?@[\\\]^_`{|}~€‚ƒ„…†‡ˆ‰‹‘’“”•–—˜™›¡¢£¤¥¦§¨©ª«¬®¯°±²³´¶·¸¹º»¼½¾¿×÷№′″ⁿ⁺⁰‱₁₂₃₄]|\s$).){1,50}$
    

    正则表达式匹配:1到50个由单个分隔符(空格-')分隔的国际字母

    Demo

        25
  •  -1
  •   Paul Tomblin    17 年前

    放弃你能想到的每一条规则在某些文化中都有例外。即使这种“文化”是喜欢在法律上把自己的名字改成“37 eet”的极客。

        26
  •  -1
  •   Ian Campbell xcodesucks123    5 年前

    ^[a-zA-Z'-\s\.]{3,20}\s[a-zA-Z'-\.]{3,20}$
    

    Aomine的回答很有帮助,我对它做了一些调整,包括:

    1. Jane J. Samuels

    2. 末尾带点的名称: John Simms Snr.

    此外,姓名应至少包含2个字母,姓氏至少包含2个字母,但每个字母不超过20个(总共40个字符)

    成功的测试用例:

    D'amalia Jones    
    David Silva Jnr.    
    Jay-Silva Thompson
    Shay .J. Muhanned
    Bob J. Iverson
    
    推荐文章