阅读此:regular expression for first and last name
这是我的测试用例:
Fail cases:
陳大文 (fail, not support international name)
Stev3 Smith (fail, contain number)
123 (fail, contain number)
@##$ smith (fail, special char)
.Mathias (fail, dot)
..Mathias (fail, dot dot)
Success cases:
Martin Luther King, Jr. (pass)
john smith (pass, javascript does str.trim())
d'Are to Beaware (pass)
Jo Blow (pass)
Steve Johnson-Smith (pass)
O Henry Smith (pass)
john & john (pass, support &)
我当前的解决方案:
const regExp = /^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ*(){}|~<>;:[\]]{0,}[^-]$/;
return condi = regExp.test(input)
我的问题是我无法通过此:
.Mathias (fail, dot)
..Mathias (fail, dot dot)
和与此同时
Martin Luther King, Jr.
任何想法?
简单,只需将[\w'\-,.]
(将与。匹配)替换为\w
,就不会。
您的测试用例将通过-是否为“真实”名称尚有争议。
想要做这种事情的问题是,您只能根据对名称的了解[[think来解决此问题。当然,有很多人会使用您经常看到的名字,例如John Smith
,但也有很多人没有。例如,您想让名字中有数字的人失败,但是有些人中有数字的人,因为这在世界各地都不是非法的。在世界上说西班牙语的地区,有些人的全名很长,而且中间名很多个,如果您不熟悉地名,这可能会破坏您对地名的其他假设。
由于一对夫妇的名字上有数字,所以放弃所有验证似乎有点愚蠢,但是真正的问题是您要对未知的未知数做出假设。您不知道那里有什么样的名称,您也不知道关于名称的某些事情。这篇关于falsehoods programmers believe about names的博客文章更加深入地介绍了此问题。
只要确保确定名称,以使世界上所有的Bobby Tables都不在数据库中,就不会有真正的综合方法来进行名称验证,而不会做出非常糟糕的猜测。特别是不适用于正则表达式。