为什么这个正则表达式在javascript中匹配?

时间:2014-02-01 05:21:30

标签: javascript regex

http://jsfiddle.net/42zcL/

处小提琴

我有以下代码,应警告“不匹配”。如果我将正则表达式放入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

1 个答案:

答案 0 :(得分:2)

因为最后有|()$,就像说“匹配{{1}之前的内容”,但如果找不到它,只要有一个结尾就匹配任何内容。“< / p>

- Full RegEx reference

- Try it out

希望这能解释得更好:

  1. 在RegEx 中使用|表示“不匹配任何内容”。如果未指定任何字符,则它仍将与字符串中每个位置的()匹配(字母位置)。 想象一下这样:“Anything”这个词变成了一个数组 - [A,n,y,t,h,i,n,g] - 如果(),占位符在n = length of that array 非空,导致“匹配”,因为模式中没有表达任何特定限制。
  2. 由于#1基本上意味着[n]会在任何经过测试的字词上返回肯定结果,因此您将始终在警报中看到“匹配”。
  3. 我在传达我的想法时非常糟糕,所以也许 this previous stack answer 会填补我的答案留下的任何漏洞。