我需要一个正则表达式来验证一个可以是1,2或3个单词的名称

时间:2012-11-08 05:28:56

标签: regex

在此示例中,我尝试验证城市名称。如果我进入圣路易斯奥比斯波,它会起作用,但如果我进入博尔德克里克或博尔德,则不行。我想 ?应该是一个块可选。

    if (!/^[a-zA-Z'-]+\s[a-zA-Z'-]*\s([a-zA-Z']*)?$/.test(field)){
        return "Enter City only a-z A-Z .\' allowed and not over 20 characters.\n";
        }

2 个答案:

答案 0 :(得分:1)

我认为空间是问题(\ s)。您将第二个和第三个单词设为可选(使用*而不是+),但不是空格。由于括号,问号仅适用于第三个单词。

答案 1 :(得分:0)

你的正则表达式的问题是,在英语中,它表示要匹配一个单词,该单词需要后跟一个空格,该空格可选地后跟另一个单词,但是后来需要有另一个空格,然后可选择另一个单词。因此,单个单词不匹配 - 但是,后跟两个空格的单词会。另外两个在末尾有空格的单词也会匹配 - 但是如果没有尾随空格也不匹配。

要修复您的确切正则表达式,您应该在句子末尾的第二个单词周围添加另一个分组(不匹配的组(?:而不仅仅是()并将此组作为可选项与?。另外,也可以在可选组中移动\s

试试这个:

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

正则表达式解释:

^                           # beginning of line
    [a-zA-Z'-]+             # first matching word
    (?:                     # start of second-matching word
        \s[a-zA-Z'-]+       # space followed by matching word
        (?:                 # start of third-matching word
            \s[a-zA-Z']+    # space followed by matching word
        )?                  # third-matching word is optional
    )?                      # second-matching word is optional
$                           # end of line

或者,您可以尝试以下正则表达式:

^([a-zA-Z'-]+(?:\s[a-zA-Z'-]+){0,2})$

这将匹配给定行中的1到3个单词或“城市”,可以调整单词范围,而无需为每个新单词进一步复制匹配集。

正则表达式解释说:

^(                            # start of line & matching group
    [a-zA-Z'-]+               # required first matching word
    (?:                       # start a non-matching group (required to "match", but not returned as an individual group)
        \s                    # sub-group required to start with a space
        [a-zA-Z'-]+           # sub-group matching word
    ){0,2}                    # sub-group can match 0 -> 2 times
)$                            # end of matching group & line

因此,如果您想添加匹配超过3个字的功能,可以将上面2范围内的{0,2}更改为您想要匹配的字数减1(即如果你想匹配4个单词,你可以将它设置为{0,3})。