star如何与分组交互

star如何与分组交互

这似乎很简单,也许我缺少明显的东西。我想以模式(.*)返回字符串中所有可变长度的子字符串。我发现我在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}时间。我在这里想念什么?

最佳答案

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

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

对于模式.*(7{0,2}).*,第一个.*将匹配整个字符串,然后不必执行任何其他操作,因为7{0,2}和第二个.*都在结尾处使用空字符串来满足串。

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

关于javascript - javascript kleene star如何与分组交互?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23856013/

10-09 14:10