javascript kleene明星如何与分组交互?

时间:2014-05-25 13:55:56

标签: javascript regex

这看起来很简单,也许我错过了一些明显的东西。我想在模式(.*)的字符串中返回所有可变长度子字符串。我发现我在Firefox控制台中的行为非常奇怪:

"666677888".match(/.*(7{1}).*/)[1];
> "7"
"666677888".match(/.*(7{2}).*/)[1];
> "77"

到目前为止一切顺利。然后:

"666677888".match(/.*(7*).*/)[1];
> ""
"666677888".match(/.*(7{0,2}).*/)[1];
> ""
"666677888".match(/.*(7{0,}).*/)[1];
> ""

这似乎表明7次匹配{1}次,{2}次,但不是{0,}次或{0,2}次。我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

正则表达式的第一部分是贪婪的,所以它将回溯以找到第二部分的匹配。

对于模式.*(7{1}).*,第一个.*将通过匹配整个字符串开始,然后它必须一次缩小一个字符,直到它找到第二个7为匹配7{1}

对于模式.*(7{0,2}).*,第一个.*将匹配整个字符串,然后它不必再执行任何操作,因为7{0,2}和第二个{{} 1}}在字符串末尾用空字符串实现。

要使表达式匹配.*,您必须强制它匹配所有7{0,2}匹配后的内容,例如不是7的字符,并强制它匹配的东西,例如通过包括字符串的结尾。模式7将与.*?(7{0,2})[^7]*$匹配。