我有以下代码,应警告“不匹配”。如果我将正则表达式放入regexpal.com并运行它,它就不匹配(如预期的那样)。使用此代码,它确实匹配。我知道还有另一种方法可以做到,它可以正常工作 - /^((.*)Waiting(.*))?$/
,但我很好奇为什么这个失败了。它应该匹配一个字符串,其中包含文本“Waiting”或者根本没有。
var teststring="Anything";
if (teststring.match(/^((.*)Waiting(.*))|()$/)) alert('match');
else alert('No Match');
编辑:更清晰的例子:
var teststring="b";
if (teststring.match(/^(a)|()$/)) alert('match');
else alert('No Match');
当我期待“不匹配”
时,产生一场比赛预期行为,根据regexpal.com:
teststring: a = match
teststring: b = no match
javascript中的实际行为:
teststring: a = match
teststring: b = match
答案 0 :(得分:2)
因为最后有|()$
,就像说“匹配{{1}之前的内容”,但如果找不到它,只要有一个结尾就匹配任何内容。“< / p>
希望这能解释得更好:
|
不表示“不匹配任何内容”。如果未指定任何字符,则它仍将与字符串中每个位置的()
匹配(字母位置)。 想象一下这样:“Anything”这个词变成了一个数组 - [A,n,y,t,h,i,n,g] - 如果()
,占位符在n = length of that array
非空,导致“匹配”,因为模式中没有表达任何特定限制。[n]
会在任何经过测试的字词上返回肯定结果,因此您将始终在警报中看到“匹配”。我在传达我的想法时非常糟糕,所以也许 this previous stack answer 会填补我的答案留下的任何漏洞。