正则表达式的名称

时间:2008-11-08 20:35:31

标签: php regex

刚开始探索正则表达式的“奇迹”。作为一个从反复试验中学习的人,我真的很挣扎,因为我的试验引发了不成比例的错误...我的实验是在PHP中使用ereg()。

反正。我分别使用名字和姓氏,但现在使用相同的正则表达式。到目前为止,我有:

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

任何长度字符串,以大写字母开头,并且只有字母(大写与否)。但是,我分崩离析的是处理几乎可以在任何地方发生的特殊情况。

  • 连字符名称(Worthington-Smythe)
  • 名字与Apostophies(D'Angelo)
  • 带空格的名字(Van der Humpton) - 在这个阶段,可能需要也可能不需要的中间位置超出我的兴趣。
  • 联名(Ben& Jerry)

也许还有一些其他的方式,我不会想到一个名字,但我怀疑如果我能解决这个问题,我可以补充一下。我很确定会出现这样一种情况中出现多个情况的情况。

所以,我认为最重要的是让我的正则表达式也接受空格,连字符,符号和撇号 - 但不是在名称的开头或结尾处技术上是正确的。

25 个答案:

答案 0 :(得分:46)

这个正则表达式对我来说很完美。

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

它在使用preg_match()的php环境中工作正常,但无处不在。

它匹配Jérémie O'Co-nor所以我认为它匹配所有UTF-8名称。

答案 1 :(得分:40)

  • 连字符名称(Worthington-Smythe)

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

^[A-Z][-a-zA-Z]+$
  • 名字与Apostophies(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)

此时你不再看单个名字了吗?

无论如何,正如你所看到的,正则表达式有一种快速成长的习惯......

答案 2 :(得分:9)

最佳注释表达式:

  • 我将使用术语特殊字符来引用以下三个字符:
    1. 短跑 -
    2. 连字符'
    3. Dot
  • 空格和特殊字符不能连续出现两次(例如: - '。 ..
  • 修剪(之前或之后没有空格)
  • 欢迎你;)

必填单个名称,没有空格,没有特殊字符:

^([A-Za-z])+$
  • Sierra 有效,杰克亚历山大无效(有空格),奥尼尔无效(有特殊字符)< / LI>

必填单个名称,不含空格, WITH 特殊字符:

^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
  • Sierra 有效, O'Neil 有效,杰克亚历山大无效(有空格)

必填单个名称,可选附加名称 WITH 空格,WITH特殊字符:

^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
  • Jack Alexander 有效, Sierra O'Neil 有效

必填单个名称,可选附加名称包含空格,没有特殊字符:

^[A-Za-z]+((\s)?([A-Za-z])+)*$
  • Jack Alexander 有效, Sierra O'Neil 无效(有特殊字符)

特殊情况

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

必填单个名称+可选附加名称+空格+特殊字符:

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

添加您自己的特殊字符

如果您想添加自己的特殊字符,请使用下划线 _ 这是您需要更新的组:

(\'|\-|\.)

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

PS:如果您有问题在这里发表评论,我会收到一封电子邮件并回复;)

答案 3 :(得分:6)

虽然我同意答案,说你基本上不能用正则表达式做到这一点,但我会指出一些反对意见(国际化字符)可以通过使用UTF字符串和\p{L}字符类来解决(匹配unicode“letter”)。

答案 4 :(得分:5)

我真的没有太多要添加到正则表达式来处理名称,因为这里已经有一些很好的建议,但是如果你想要一些资源来学习更多关于正则表达式的知识,你应该看看:

答案 5 :(得分:4)

基本上,我同意保罗......你总能找到例外,例如 di Caprio DeVil 等。

备注你的消息:在PHP中,ereg通常被认为是过时的(缓慢的,不完整的),有利于preg(PCRE regexes)。
你应该尝试一些正则表达式测试器,就像强大的Regex Coach一样:它们非常适合快速测试任意字符串的RE。

如果你真的需要解决问题但对上述答案不满意,那就问一下,我会放手一搏。

答案 6 :(得分:4)

我是第二个'放弃'的建议。即使您考虑数字,连字符,撇号等,[a-zA-Z]之类的东西仍然不会有国际名称(例如,那些有šđčćž,或西里尔字母,或中文字符......)

但是......为什么你甚至试图验证名字?你想要捕捉到什么错误?难道你不认为人们比你知道更好地写出自己的名字吗? ;)说真的,通过尝试验证名称,你唯一可以做的就是激怒那些名字不同的人。

答案 7 :(得分:4)

这对我有用:

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

此正则表达式将正确匹配以下名称:

jean-claude van damme

nadine arroyo-rodriquez

wayne la pierre

beverly d'angelo

billy-bob thornton

tito puente

susan del rio

它将“van damme”,“arroyo-rodriquez”,“d'angelo”,“billy-bob”等组合在一起,以及像“wayne”这样的单数名称。

请注意,它不会测试分组的内容实际上是有效名称。像其他人说的那样,你需要一本字典。此外,它会对数字进行分组,因此,如果这是一个问题,您可能需要修改正则表达式。

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

答案 8 :(得分:2)

检查出来:

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

regex

您可以对其进行测试herehttps://regex101.com/r/mS9gD7/46

答案 9 :(得分:1)

^[A-Z][a-zA-Z '&-]*[A-Za-z]$ 

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

答案 10 :(得分:1)

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

regex to match a maximum of 4 spaces

基本上,你有一个问题,实际上没有一个字符不能形成合法的名字字符串。

如果你仍然限制自己没有äüæß和其他类似的非严格ascii字符。

获取UTF32字符表的副本,并了解您的简单正则表达式错过了多少百万的有效字符。

答案 11 :(得分:1)

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

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

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

答案 12 :(得分:1)

通过使用 strtoupper() <将字符串转换为全部大写,您可以轻松地中和字母是大写还是小写的整个问题 - 即使在意外或不常见的位置 - / strong>然后根据你的正则表达式进行检查。

答案 13 :(得分:1)

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

试试这个。您还可以强制使用^开始使用char,并使用$

以char结尾

答案 14 :(得分:1)

我遇到了同样的问题,就像许多其他人发布的那样,这不是100%傻瓜式的表达,但它对我们有用。

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

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

答案 15 :(得分:1)

改善daan的回答:

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

只允许在a-z和有效的unicode字符中出现连字符或萎缩。

也会做一个回溯以确保字符串末尾没有连字符或撇号。

答案 16 :(得分:0)

如果你添加空格,那么“他周日去市场”将是一个有效的名字。

我不认为你可以用正则表达式做到这一点,你不能使用正则表达式从一大块文本中轻松检测名称,你需要一个已批准名称的字典并根据它进行搜索。不会检测到列表中没有的任何名称。

答案 17 :(得分:0)

您可以在下面使用此名称

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

^字符串的开头

$字符串

的结尾

\s空间

[a-zA-Z'-\s]{3,}将接受任意长度为3个字符或更长的名称,其中包含'-的名称,如jean-luc

因此,在我们的案例中,它只接受以空格分隔的2个部分的名称

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

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

答案 18 :(得分:0)

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

它很灵活 - 您可以在表达式中添加/删除您想要的字符(专注于您想要拒绝而不是包含的字符)。

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

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

正则表达式拒绝:空前缀/后缀、连续分隔符(空格 - ')、数字、换行符、制表符、有限的扩展 ASCII 字符列表

Demo

答案 19 :(得分:0)

度过美好的一天!

答案 20 :(得分:0)

我已经为名称提出了这个RegEx模式:

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

有效。我想你也应该使用它。

它只匹配名称或字符串,如:

  

博士。 Shaquil O'Neil Armstrong Buzz-Aldrin

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

  

约翰保

它不会匹配带有结束空格的字符串,如:

  

约翰保罗

上面的文字有一个结束空格。尝试突出显示或选择文本以查看空间

以下是我用来学习和创建自己的正则表达式模式的内容:

RegExr: Leanr, Build and Test RegEx

答案 21 :(得分:0)

我认为“/ ^ [a-zA-Z'] + $ /”是不够的,它允许通过单个字母我们可以通过添加{4,20}来调整范围,这意味着字母的范围是4到20岁。

答案 22 :(得分:0)

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

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

答案 23 :(得分:-1)

试试这个正则表达式:

^[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

答案 24 :(得分:-1)

放弃。您可以想到的每条规则在某些文化或其他文化中都有例外。即使那种“文化”是极客喜欢合法地将他们的名字改为“37eet”。