0

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

    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";
        }
4

2 回答 2

1

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

于 2012-11-08T05:50:29.107 回答
0

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

要修复您的确切正则表达式,您应该在句子末尾的第二个单词周围添加另一个分组(不匹配的组,(?:而不是 just (),并将该组作为可选的?. 此外,将\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})。

于 2012-11-08T05:53:21.573 回答