在此示例中,我尝试验证城市名称。如果我进入圣路易斯奥比斯波,它会起作用,但如果我进入 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";
}
在此示例中,我尝试验证城市名称。如果我进入圣路易斯奥比斯波,它会起作用,但如果我进入 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";
}
我认为空格是问题(\ s)。您将第二个和第三个单词设为可选(通过使用 * 而不是 +),但不是空格。由于括号,问号仅应用于第三个单词。
您的正则表达式的问题在于,在英语中,它表示要匹配一个需要后跟一个空格的单词,该空格后面可以选择跟随另一个单词,但随后需要有另一个空格,然后是可选的另一个单词。因此,一个单词不会匹配 - 但是,一个单词后跟两个空格会匹配。此外,末尾有空格的两个单词也会匹配 - 但没有尾随空格的单词都不会匹配。
要修复您的确切正则表达式,您应该在句子末尾的第二个单词周围添加另一个分组(不匹配的组,(?:
而不是 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}
)。