在此示例中,我尝试验证城市名称。如果我进入圣路易斯奥比斯波,它会起作用,但如果我进入博尔德克里克或博尔德,则不行。我想 ?应该是一个块可选。
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";
}
答案 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}
)。