我需要确保人们为Rails中的表单正确输入他们的名字,中间名和姓氏。因此,正则表达式的第一个想法是:
\A[[:upper:]][[:alpha:]'-]+( [[:upper:]][[:alpha:]'-]*)*\z
这将确保名称中的每个单词都以大写字母开头,后跟字母或连字符或撇号。
我猜我的第一个问题与正则表达式没什么关系,尽管我希望有一个正则表达式,我可以为此复制。字母,连字符和撇号是我应该在名字中检查的唯一字符吗?
我的第二个问题是,确保每个名字至少包含1个大写字母是否很重要?这么多人输入所有小写名称,我真的想避免这种情况,但它有时合法吗?
这是我到目前为止确保名称中至少有一个大写字母:
\A([[:alpha:]'-]+ )*[[:alpha:]'-]*[[:upper:]][[:alpha:]'-]*( [[:alpha:]'-]+)*\z
是否有[:name:]括号表达式? :)
更新 :我在允许的字符中添加了.
和,
,我最初并没有想到它们。 这么多的人必须要处理这种正则表达式!对于这类事情,没有人有任何预先制作的正则表达式吗?
答案 0 :(得分: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阅读此excellent piece on names。它甚至会动摇你的名字,中间名和姓名的概念。
例如:
在某些文化中,你会得到一个名字(Björk,Osama),并告诉你父亲(或母亲)是谁(Guðmundsdóttir,bin Mohammed)。所以“名字”可能是“Björk”但是:
Björk通常不会被称为Guðmundsdóttir女士。冰岛的电话簿按名称排序。
但在其他文化中,没有给出名字,而是给出一个姓氏。在“ZhāngMànyù”中,“Zhāng”是姓氏。如何解决她,取决于你对她的了解程度,但“女士”再一次会很奇怪。
示例列表以维基百科的30多个链接为基础,以更多示例结束。
本文最后提出了field design的建议以及允许使用哪些字符的一些指示:
不要忘记允许人们在名称中使用连字符,撇号等标点符号。不要求以大写字母全部输入名称 - 这在移动设备上可能很难。允许用户输入带空格的名称,例如。支持前缀和后缀,例如法语中的de,德语中的von和美国名称中的Jnr / Jr,还因为有些人认为空格分隔的字符序列是单个名称,例如。 Rose Marie。
答案 1 :(得分:0)
回答有关大写字母的问题:在世界上许多地方,名字不一定以大写字母开头。例如,在荷兰语中,你有姓氏,例如" van der Vliet"像" van"," de"," den"和" der"没有资本化。此外,您还有特殊情况,例如" De fauw"和" Van pellicom"行政错误从未得到纠正,正确的大写是相当不合逻辑的。请不要错误地拒绝这些名字。
我也知道南非的城镇名称,例如eThekwini,其中大写字母不一定是单词的第一个字母。这很可能出现在姓氏或姓名中。