刚开始探索正则表达式的“奇迹”。作为一个从反复试验中学习的人,我真的很挣扎,因为我的试验引发了不成比例的错误...我的实验是在PHP中使用ereg()。
反正。我分别使用名字和姓氏,但现在使用相同的正则表达式。到目前为止,我有:
^[A-Z][a-zA-Z]+$
任何长度字符串,以大写字母开头,并且只有字母(大写与否)。但是,我分崩离析的是处理几乎可以在任何地方发生的特殊情况。
也许还有一些其他的方式,我不会想到一个名字,但我怀疑如果我能解决这个问题,我可以补充一下。我很确定会出现这样一种情况中出现多个情况的情况。
所以,我认为最重要的是让我的正则表达式也接受空格,连字符,符号和撇号 - 但不是在名称的开头或结尾处技术上是正确的。
答案 0 :(得分:46)
这个正则表达式对我来说很完美。
^([ \u00c0-\u01ffa-zA-Z'\-])+$
它在使用preg_match()的php环境中工作正常,但无处不在。
它匹配Jérémie O'Co-nor
所以我认为它匹配所有UTF-8名称。
答案 1 :(得分:40)
在第二个字符类中添加 - 。最简单的方法是在开始时添加它,以便它不可能被解释为范围修饰符(如a-z
中所示)。
^[A-Z][-a-zA-Z]+$
一种天真的做法如上所述,给出:
^[A-Z][-'a-zA-Z]+$
不要忘记你可能需要在弦内逃脱它!一个'更好'的方式,给出你的例子可能是:
^[A-Z]'?[-a-zA-Z]+$
这将允许在第二个位置可能的单个撇号。
在这里,我很想再次采取天真的态度:
^[A-Z]'?[- a-zA-Z]+$
可能更好的方法可能是:
^[A-Z]'?[- a-zA-Z]( [a-zA-Z])*$
最后会查找额外的单词。如果你试图在额外文本的主体中匹配名称,这可能不是一个好主意,但是再一次,原文也不会做得那么好。
此时你不再看单个名字了吗?
无论如何,正如你所看到的,正则表达式有一种快速成长的习惯......
答案 2 :(得分:9)
最佳注释表达式:
必填单个名称,没有空格,没有特殊字符:
^([A-Za-z])+$
必填单个名称,不含空格, WITH 特殊字符:
^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
必填单个名称,可选附加名称, WITH 空格,WITH特殊字符:
^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
必填单个名称,可选附加名称,包含空格,没有特殊字符:
^[A-Za-z]+((\s)?([A-Za-z])+)*$
许多现代智能设备在每个单词的末尾添加空格,因此在我的应用程序中,我允许在字符串之前和之后无限数量的空格,然后我在后面的代码中修剪它。所以我使用以下内容:
必填单个名称+可选附加名称+空格+特殊字符:
^(\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-rodriquezwayne la pierre
beverly d'angelo
billy-bob thornton
tito puentesusan del rio
它将“van damme”,“arroyo-rodriquez”,“d'angelo”,“billy-bob”等组合在一起,以及像“wayne”这样的单数名称。
请注意,它不会测试分组的内容实际上是有效名称。像其他人说的那样,你需要一本字典。此外,它会对数字进行分组,因此,如果这是一个问题,您可能需要修改正则表达式。
我写这个来解析MapReduce应用程序的名称。我想要的只是从名称字段中提取单词,将del foo和la bar以及billy-bobs组合成一个单词,以使键值对生成更加准确。
答案 8 :(得分:2)
答案 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 字符列表
答案 19 :(得分:0)
/^([A-Z][a-z]([ ][a-z]+)([ '-]([&][ ])?[A-Z][a-z]+)*)$/
度过美好的一天!
答案 20 :(得分:0)
我已经为名称提出了这个RegEx模式:
/^([a-zA-Z]+[\s'.]?)+\S$/
有效。我想你也应该使用它。
它只匹配名称或字符串,如:
博士。 Shaquil O'Neil Armstrong Buzz-Aldrin
它不会匹配具有2个或更多空格的字符串,如:
约翰保
它不会匹配带有结束空格的字符串,如:
约翰保罗
上面的文字有一个结束空格。尝试突出显示或选择文本以查看空间
以下是我用来学习和创建自己的正则表达式模式的内容:
答案 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 的回答很有帮助,我稍微调整了一下以包括:
带点的名称(中间):Jane J. Samuels
以点结尾的名称: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”。