试图允许用空格分隔的无限单词

时间:2011-07-27 16:31:05

标签: regex

我有一个正则表达式,只允许一个人姓名中的连字符和撇号,并禁止所有数字和特殊字符。现在它将它限制为2个名字,但我想允许无限名称,只允许连字符和撇号。

^\s*[a-zA-Z]+(([\'\-\+\s]\s*[a-zA-Z])?[a-zA-Z]*)\s*$

我需要它允许:丹尼斯丹尼斯的丹尼斯丹尼斯等。现在它只允许2个单词并在第3个单词上返回不匹配。

3 个答案:

答案 0 :(得分:1)

似乎您向后编写了regEx以允许无限名称。相反,你应该检查名称,以确保它们不包含任何特殊字符

var myname="whatever";
if ((/\$|\/|\^|-/, "g").exec(myname)){
    alert("this has special characters";
}else{
    alert "this does not";
}

答案 1 :(得分:1)

你有两个选择。

  1. 只允许有效字符。缺点是安排可能很奇怪,好处是你不是过于严格,可能会拒绝你没想到的有效的东西。

    ^[A-Za-z'+\-\s]+$
    
  2. 创建有效名称模式的重复组。这似乎是你想要做的,虽然你没有指定完全有效名称是什么。以下是一个示例,基于您的示例:

    /^\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*)+$