一个用于名称的正则表达式

11

我需要确保在Rails表单中人们正确输入他们的名字、中间名和姓。对于正则表达式的第一个想法是:

\A[[:upper:]][[:alpha:]'-]+( [[:upper:]][[:alpha:]'-]*)*\z

这将确保名称中的每个单词都以大写字母开头,后跟一个字母、连字符或撇号。

我第一个问题似乎与正则表达式没有多少关系,但我希望有一个可以复制的正则表达式来解决这个问题。在一个名字中,我应该检查的是字母、连字符和撇号吗?

我的第二个问题是,是否重要确保每个名字至少有1个大写字母?很多人输入全部小写的名字,我真的想避免这种情况,但是有时它是合法的吗?

这是我到目前为止的代码,它确保名称中至少有一个大写字母:

\A([[:alpha:]'-]+ )*[[:alpha:]'-]*[[:upper:]][[:alpha:]'-]*( [[:alpha:]'-]+)*\z

难道没有 [:name:] 方括号表达式吗? :)

更新:我将 . 添加到允许的字符中,惊讶于我最初没有想到它们。这种正则表达式的情况肯定有很多人要处理!没有人为这类事情准备过正则表达式吗?


14
提示:一个名称可以包含任何东西 - Jerry
2
哈哈,你的软件将会告诉某些可怜的家伙“名称不正确” :) - Lodewijk Bogaards
6
用正则表达式或其他方式验证姓名,是一个糟糕的想法!详见链接:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ - Biffen
1
我正在处理一些孩子,其中一些几乎不会阅读。我希望告诉他们如何更好地输入他们的姓名,而不是“samtha jones”。这是一个与国际全面名称注册不同的用例。 - at.
4
正则表达式是教育者的劣质替代品……@Dave Everitt:非国际化不再存在。人们不像树一样固定,他们会移动,成为外籍人士。 - Chris Wesseling
显示剩余9条评论
2个回答

8
一个好的开始是允许字母、标记、标点和空格。这可以允许像“María-Jose”这样的名字和像“van Rossum”的姓氏(注意空格)。因此,这大致可以表示为:
[\p{Letter}\p{Mark}\p{Punctuation}\p{Separator}]+

如果你想要稍微限制一下,可以考虑使用类似于\p{Lowercase_Letter}\p{Uppercase_Letter}\p{Titlecase_Letter}这样的类,但是有些语言可能没有大小写之分。使用\p{Space_Separator}\p{Dash_Punctuation}可以缩小范围到我知道的名字,但是我不知道的名字......就不知道了。

但是,在你开始构建用于“验证”名称的正则表达式之前,请阅读W3C关于姓名的优秀文章。它将震撼您对名、中、姓的概念。

例如:

在某些文化中,你会被赋予一个名字(比如Björk、Osama),以及你父亲(或母亲)的身份信息(Guðmundsdóttir、bin Mohammed)。所以,“名字”可能是“Björk”,但是:

Björk通常不希望被称为 Guðmundsdóttir女士。冰岛的电话簿是按名字排序的。

但是在其他文化中,名字不是给定的,而是一个姓。在“Zhāng Mànyù”中,“Zhāng”是姓氏。如何称呼她,取决于你对她的熟悉程度,但是再次称呼“Ms. Zhāng”会很奇怪。

这个例子列表还有30多个维基百科链接以供更多参考。

该文章最后提供了关于字段设计和允许使用哪些字符的一些建议:

不要忘记允许在姓名中使用标点符号,如连字符、撇号等。不要要求所有名字都用大写字母输入-这在移动设备上可能很困难。允许用户输入带空格的名称,例如支持法语中的前缀和后缀,如de,在德语中von,以及美国名字中的Jnr/Jr,还因为有些人认为由空格分隔的字符序列是一个单独的名字,例如Rose Marie。


0
关于大写字母的问题,我想回答你:在世界上许多地区,名字并不一定以大写字母开头。例如,在荷兰,你有像“van der Vliet”这样的姓氏,其中像“van”、“de”、“den”和“der”这样的单词不会大写。此外,还有特殊情况,例如“De fauw”和“Van pellicom”,其中行政错误从未得到纠正,正确的大小写逻辑相当不合理。请不要犯拒绝这些名称的错误。
我还知道南非的城镇名称,例如eThekwini,其中大写字母不一定是单词的第一个字母。这同样可能出现在姓氏或名字中。

我在我的问题中考虑了名字中间或末尾的大写字母。 - at.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接