这看起来很简单,也许我错过了一些明显的东西。我想在模式(.*)
的字符串中返回所有可变长度子字符串。我发现我在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}
次。我在这里缺少什么?
答案 0 :(得分:3)
正则表达式的第一部分是贪婪的,所以它将回溯以找到第二部分的匹配。
对于模式.*(7{1}).*
,第一个.*
将通过匹配整个字符串开始,然后它必须一次缩小一个字符,直到它找到第二个7
为匹配7{1}
。
对于模式.*(7{0,2}).*
,第一个.*
将匹配整个字符串,然后它不必再执行任何操作,因为7{0,2}
和第二个{{} 1}}在字符串末尾用空字符串实现。
要使表达式匹配.*
,您必须强制它匹配所有7{0,2}
匹配后的内容,例如不是7
的字符,并强制它匹配的东西,例如通过包括字符串的结尾。模式7
将与.*?(7{0,2})[^7]*$
匹配。