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