我有一个正则表达式,只允许一个人姓名中的连字符和撇号,并禁止所有数字和特殊字符。现在它将它限制为2个名字,但我想允许无限名称,只允许连字符和撇号。
^\s*[a-zA-Z]+(([\'\-\+\s]\s*[a-zA-Z])?[a-zA-Z]*)\s*$
我需要它允许:丹尼斯丹尼斯的丹尼斯丹尼斯等。现在它只允许2个单词并在第3个单词上返回不匹配。
答案 0 :(得分:1)
似乎您向后编写了regEx以允许无限名称。相反,你应该检查名称,以确保它们不包含任何特殊字符
var myname="whatever";
if ((/\$|\/|\^|-/, "g").exec(myname)){
alert("this has special characters";
}else{
alert "this does not";
}
答案 1 :(得分:1)
你有两个选择。
只允许有效字符。缺点是安排可能很奇怪,好处是你不是过于严格,可能会拒绝你没想到的有效的东西。
^[A-Za-z'+\-\s]+$
创建有效名称模式的重复组。这似乎是你想要做的,虽然你没有指定完全有效名称是什么。以下是一个示例,基于您的示例:
/^\s*(?:\s?[A-Za-z]+(?:[\-'+][a-zA-Z]+)?)+\s*$/
此模式显示: start,0或更多空格,然后是组中的一个或多个:(可选空格(对于第二个和更晚的单词),1个或多个AZ,以及一个可选组:(1个破折号,撇号,或加上一个或多个AZ)),0或更多的空格,结束
答案 2 :(得分:1)
以下是您的解释:
^\s* #Match 0+ whitespace
[a-zA-Z]+ #Match 1 or more alpha characters
( #Capturing Group 1
( #Capturing Group 2
[\'\-\+\s] #Match one of these characters.
\s* #Match 0+ whitespace
[a-zA-Z] #Match one alpha character
)? #0 or 1 of Group 2
[a-zA-Z]* #0+ alpha characters
) #End Group 1
\s* #Then 0+ whitespace.
$
你可以做很多改进,但我认为只用一个额外的小组围绕整个事情就可以做到最小的改变:
^(\s*[a-zA-Z]+(([\'\-\+\s]\s*[a-zA-Z])?[a-zA-Z]*)\s*)+$