正则表达式的名称

Hum*_*ton 25 php regex

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

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

^[A-Z][a-zA-Z]+$  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Daa*_*aan 46

这个正则表达式对我来说是完美的.

^([ \u00c0-\u01ffa-zA-Z'\-])+$
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*ley 41

  • 连字符(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)

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

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


小智 10

最佳注释表达式:

  • 我将使用术语特殊字符来指代以下三个字符:
    1. 短跑-
    2. 连字符'
    3. .
  • 空格和特殊字符不能连续出现两次(例如:-'...)
  • 修剪(前后无空格)
  • 别客气 ;)

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

^([A-Za-z])+$
Run Code Online (Sandbox Code Playgroud)
  • Sierra有效,Jack Alexander无效(有空格),O'Neil无效(有特殊字符)

强制单个名称,WITHOUT空格,WITH特殊字符:

^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
Run Code Online (Sandbox Code Playgroud)
  • 塞拉有效,奥尼尔有效,杰克亚历山大无效(有空位)

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

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

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

^[A-Za-z]+((\s)?([A-Za-z])+)*$
Run Code Online (Sandbox Code Playgroud)
  • Jack Alexander有效,Sierra O'Neil无效(有特殊性格)

特殊情况

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

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

^(\s)*[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*(\s)*$
Run Code Online (Sandbox Code Playgroud)

添加自己的特殊字符

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

(\'|\-|\.)
Run Code Online (Sandbox Code Playgroud)

(\'|\-|\.|\_)
Run Code Online (Sandbox Code Playgroud)

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


eye*_*ess 6

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


Vir*_*dia 5

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


tk_*_*tk_ 5

安全提示:请确保在此步骤之前验证字符串的大小,以避免 DoS 攻击,该攻击会通过发送很长的字符集来瘫痪您的系统。

看一下这个:

^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$
Run Code Online (Sandbox Code Playgroud)

正则表达式

您可以在这里测试它:https://regex101.com/r/mS9gD7/46