名称的正则表达式

2022-08-30 15:45:02

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

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

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

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

  • 连字符名称(沃辛顿-斯迈思)
  • 带有使徒的名字(D'Angelo)
  • 带有空格的名称(Van der Humpton) - 中间的大写字母可能是必需的,也可能是不需要的,这远远超出了我在这个阶段的兴趣范围。
  • Joint Names (Ben & Jerry)

也许还有其他一些我没有想到的名字,但我怀疑如果我能解决这个问题,我可以添加它。我很确定在某些情况下,不止一种情况会出现在一个名字中。

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


答案 1

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

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

它在使用preg_match()的php环境中工作正常,但并非在所有地方都有效。

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


答案 2
  • 连字符名称(沃辛顿-斯迈思)

将 - 添加到第二个字符类中。最简单的方法是在开始时添加它,这样它就不可能被解释为范围修饰符(如 中所示)。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])*$

这在最后寻找额外的单词。如果您尝试在额外文本正文中匹配名称,这可能不是一个好主意,但话说回来,原文也不会做得那么好。

  • Joint Names (Ben & Jerry)

在这一点上,你不再看单个名字了吗?

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


推荐