正则expression式的名字
刚开始探索正则expression式的“奇迹”。 作为一个从试验和错误中学习的人,我真的很挣扎,因为我的试验抛出了不成比例的错误…我的实验使用ereg()在PHP中进行。
无论如何。 我分别使用名字和姓氏,但现在使用相同的正则expression式。 到目前为止我有:
^[AZ][a-zA-Z]+$
任何长度的string,以大写字母开头,其余字母(大写或小写)。 但是我分崩离析的地方就是处理几乎任何地方都可能发生的特殊情况。
- 连字(Worthington-Smythe)
- 名字与使徒(D'Angelo)
- 空间名称(Van der Humpton) – 在这个阶段可能需要也可能不需要的中间首都是超出我的兴趣的。
- 联名(Ben&Jerry)
也许还有一个名字可以是我没有想到的,但是我怀疑如果我可以把我的头放在这里,我可以补充一下。 我很确定会有这样的情况,其中有一个以上的情况出现在一个名称中。
所以,我认为底线是让我的正则expression式也接受一个空格,连字符,&符号和撇号 – 但不是在名称的开头或结尾,在技术上是正确的。
- 连字(Worthington-Smythe)
在第二个字符类中添加一个。 最简单的方法是在开始时添加它,这样它就不可能被解释为范围修饰符(如在az
)。
^ [AZ] [ - A-ZA-Z] + $
- 名字与使徒(D'Angelo)
这样做的一个天真的方式将如上,给:
^ [AZ] [ - “A-ZA-Z] + $
不要忘记,你可能需要在string中逃避它! 一个“更好”的方式,给你的例子可能是:
^ [AZ]'?[ - A-ZA-Z] + $
这将允许一个可能的单撇号在第二个位置。
- 空间名称(Van der Humpton) – 在这个阶段可能需要也可能不需要的中间首都是超出我的兴趣的。
在这里,我会试图再次做我们天真的方式:
^ [AZ]'?[ - a-zA-Z] + $
一个更好的方法可能是:
^ [AZ]'?[ - a-zA-Z]([a-zA-Z])* $
在最后寻找额外的单词。 这可能不是一个好主意,如果你想在一个额外的文本的身体匹配的名字,但是再一次,原来也不会做得很好。
- 联名(Ben&Jerry)
现在你不再看单个名字了?
无论如何,正如你所看到的,正则expression式有一个快速增长的习惯。
这个正则expression式对我来说是完美的。
^([ \u00c0-\u01ffa-zA-Z'\-])+$
它使用preg_match()在php环境中工作正常,但无处不在。
它与Jérémie O'Co-nor
匹配Jérémie O'Co-nor
所以我认为它匹配所有的UTF-8名称。
最佳REGEXexpression式名称:
- 我将使用术语“ 特殊字符”来表示以下三个字符:
- 短跑–
- 连字符'
- 点。
- 空格和特殊字符不能连续出现两次(例如: –或'。或.. )
- 修剪(之前或之后没有空格)
- 别客气 ;)
强制性单一名称,不含空格,不含特殊字符:
^([A-Za-z])+$
- 塞拉利昂是有效的, 杰克亚历山大无效(有空间), 奥尼尔无效(有特殊性格)
强制单名,不带空格,带特殊字符:
^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
- 塞拉利昂是有效的, 奥尼尔是有效的, 杰克亚历山大是无效的(有一个空间)
强制单名, 可选附加名称 , WITH空格,带特殊字符:
^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
- 杰克·亚历山大是有效的, 塞拉·奥尼尔是有效的
强制单名, 可选附加名称 , WITH空格, 不带特殊字符:
^[A-Za-z]+((\s)?([A-Za-z])+)*$
- 杰克·亚历山大是有效的, 塞拉·奥尼尔是无效的(有一个特殊的性格)
特例
许多现代智能设备在每个单词的末尾添加空格,所以在我的应用程序中,我允许在string之前和之后有无限数量的空格,然后在后面的代码中修剪它。 所以我使用以下内容:
强制性单一名称+可选的附加名称+空格+特殊字符:
^(\s)*[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*(\s)*$
添加您自己的特殊字符
如果你想添加自己的特殊字符,比如下划线_这是你需要更新的组:
(\'|\-|\.)
至
(\'|\-|\.|\_)
PS:如果您在这里有问题的评论,我会收到一封电子邮件并回复;)
虽然我同意答案说你基本上不能用正则expression式做这个,但我会指出一些反对意见(国际化字符)可以通过使用UTFstring和\p{L}
字符类(匹配unicode “信”)。
我真的没有太多的东西来添加到一个正则expression式来处理名称,因为这里已经有一些好的build议,但是如果你想了解更多的正则expression式的一些资源,你应该检查:
- 正则expression式库的 备忘单
- 另一个备忘单
- DevNetwork论坛上的正则expression式教程: 第1 部分和第2部分
- PHP构build器的教程
- 如果您需要为JavaScript执行正则expression式(这有点不同),请尝试使用JavaScript Kit或此资源或Mozilla的参考
我第二个“放弃”的build议。 即使考虑数字,连字符,撇号等,[a-zA-Z]之类的东西仍然不能用国际名称(例如那些有šđčćž或西里尔字母或汉字的国名)
但是…为什么你甚至想要validation名字? 你试图抓住什么错误? 你不觉得人们比你更好地写下自己的名字吗? ;)认真地说,你可以通过试图validation名字来做唯一的事情,就是用不寻常的名字来激怒人们。
基本上,我同意保罗…你总会发现exception,如卡普里奥 , DeVil ,或者这样的。
备注:在PHP中,ereg通常被认为是过时的(缓慢,不完整),有利于preg(PCRE正则expression式)。
你应该尝试一下正则expression式testing器,就像强大的正则expression式教练一样 :它们能够快速地testing任意string的RE。
如果你真的需要解决你的问题,并不满意上面的答案,只要问,我会放弃。
这对我工作:
+[az]{2,3} +[az]*|[\w'-]*
这个正则expression式将正确地匹配如下的名字:
让·克劳德·范·达姆
纳丁阿罗约 – 罗德里格斯
韦恩拉皮埃尔
贝弗莉·安杰洛
比利鲍勃桑顿
tito puente
苏珊·德尔里奥
它将组合“van damme”,“arroyo-rodriquez”,“d'angelo”,“billy-bob”等以及“wayne”这样的单数名字。
请注意,它不testing分组的东西实际上是一个有效的名称。 像其他人所说,你需要一个字典。 此外,它会分组号码,所以如果这是一个问题,你可能想要修改正则expression式。
我写这个来parsingMapReduce应用程序的名字。 我只想从名字字段中提取单词,将del foo,la bar和billy-bob组合成一个单词,以使键值对生成更加准确。
^[AZ][a-zA-Z '&-]*[A-Za-z]$
将接受以大写字母开头的任何内容,然后是零个或多个任意的字母,空格,连字符,&符或撇号,并以字母结尾。
看到这个问题更多相关的“名称检测”相关的东西。
正则expression式匹配最多4个空格
基本上,你有一个问题,那就是没有有效的字符不能形成合法的名字串。
如果你仍然限制自己的单词没有äüæß和其他类似的非严格ASCII字符。
让自己一个UTF32字符表的副本,并认识到有多less数百万有效字符是你的简单正则expression式会错过。
为了改善大安的答案:
^([\u00c0-\u01ffa-zA-Z]+\b['\-]{0,1})+\b$
只允许在az和有效的unicode字符中出现连字符或单字的单个发生。
也做一个回溯,以确保在string的末尾没有连字符或撇号。
要在用户名中添加多个点,使用这个正则expression式:
^[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_\.]*$
string长度可以单独设置。
通过使用strtoupper()将string转换为全部大写字母,然后使用正则expression式对其进行检查,您可以轻松地中和整个字母是大写还是小写的问题 – 即使在意外或不常见的位置。
/([\u00c0-\u01ffa-zA-Z'\-]+[ ]?[*]?[\u00c0-\u01ffa-zA-Z'\-]*)+/;
尝试这个 。 您也可以强制使用^开始char,并以$使用char结束
我遇到了同样的问题,和其他许多人一样,这不是一个100%的愚蠢的certificate,但它是为我们工作。
/([\-'az]+\s?){2,4}/
这将检查第一个和/或最后一个名字中的任何连字符和/或撇号,以及检查第一个和最后一个名字之间的空格。 最后一部分是一个小魔术,将检查2到4个名字。 如果你有很多可能有5个甚至6个名字的国际用户,你可以把它改成5或者6,它应该适合你。
如果你添加空格,那么“他星期天去市场”将是一个有效的名字。
我不认为你可以用一个正则expression式来做这件事,你不能用一个正则expression式很容易地从一个文本块中检测名字,你需要一个经过批准的名字的字典,并根据这个字典进行search。 任何不在列表中的名字都不会被检测到。
我用过这个,因为name可以是file-patch的一部分。
//http://support.microsoft.com/kb/177506 foreach(array('/','\\',':','*','?','<','>','|') as $char) if(strpos($name,$char)!==false) die("Not allowed char: '$char'");
我认为“/ ^ [a-zA-Z'] + $ /”是不够的,它将允许传递单个字母,我们可以通过添加{4,20}来调整范围,这意味着字母的范围是4到20。
我已经想出了这个RegEx模式的名字:
/^([a-zA-Z]+[\s'.]?)+\S$/
有用。 我想你也应该使用它。
它仅匹配名称或string,如:
Shaquil O'Neil Armstrong博士 – 奥尔德林博士
它不会匹配具有2个或更多空格的string,如下所示:
约翰保罗
它不会匹配具有如下结尾空格的string:
约翰保罗
上面的文字有一个结束的空间。 尝试突出显示或select文本来查看空间
以下是我用来学习和创build自己的正则expression式模式:
RegExr:Leanr,构build和testingRegEx
- 尝试这个:
/ ^([AZ] [az] ([] [az] +) ([' - ]([&] [])?[AZ] [az] +)*)$ /
- 演示: http : //regexr.com/3bai1
祝你今天愉快 !
你可以使用下面的名字
^[a-zA-Z'-]{3,}\s[a-zA-Z'-]{3,}$
^
string的开头
$
string的结尾
\s
空间
[a-zA-Z'-\s]{3,}
将接受长度等于或jean-luc
3个字符的任何名字,并且包括名字'
或者像jean-luc
所以在我们的情况下,它只会接受由空格隔开的两个部分的名称
在多个名字的情况下,你可以添加一个\s
^[a-zA-Z'-\s]{3,}\s[a-zA-Z'-]{3,}$
看一下这个:
^(([A-Za-z]+[,.]?[ ]?|[az]+['-]?)+)$
你可以在这里testing它: https : //regex101.com/r/mS9gD7/46
放弃。 你所能想到的每一条规则在某种文化或其他文化中都有例外。 即使这种“文化”是喜欢合法改名为“三十七”的极客。