所谓贪婪模式和非贪婪模式,都是在正则表达式进行匹配时的一种状态。
var str = 'hello world "tomorrow" will be "better" '
str.match(/".*"/g);
按照一贯的逻辑思维,匹配得到的结果应该会是tomorrow
和better
。但是我们运行一下会发现,匹配的结果是"tomorrow" will be "better"
。
这个时候就是正则的贪婪模式在起作用。
所谓的贪婪模式就是在可以匹配多个结果时选取最大值的结果个数。
当匹配个数时,出现“+、*、{n,m}、{n,}”这些量词的时候,默认为最大数值的匹配个数。
上面的例子中,我们想让匹配的结果和我们预想的一样该如何操作呢?
取消贪婪模式时,只需要在量词后面加上“?”即可。
var str = 'hello world "tomorrow" will be "better" '
str.match(/".*?"/g);
这个时候我们就关闭了贪婪模式,正则引擎在匹配时会尽可能少的来匹配字符。上面代码的输出结果即为"tomorrow"
和"better"
。
总结一下:在数量匹配时,正则引擎默认的规则为“贪婪模式”。在贪婪模式下,正则引擎会尽可能多的匹配字符,一直到匹配的结果为false
时,回溯去寻找倒数第一个匹配位置,返回结果。“非贪婪模式”下,正则引擎会尽可能少的匹配字符,将第一个匹配结果为true
的结果返回。取消贪婪模式的方法实在量词后面加上“?”即可。