1. 概述
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为。
贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配(最大范围匹配);
非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配(最小范围匹配);
2. 贪婪与非贪婪模式匹配举例
eg:
源字符串:aa<div>test1</div>bb<div>test2</div>cc
正则一:<div>.*</div>
let str='aa<div>test1</div>bb<div>test2</div>cc'
let reg = '<div>.*</div>'
console.log(str.match(reg)[0])
// 输出:<div>test1</div>bb<div>test2</div>
正则二:<div>.*?</div>
let str='aa<div>test1</div>bb<div>test2</div>cc'
let reg = '<div>.*?</div>'
console.log(str.match(reg)[0])
// 输出:<div>test1</div>
(这里指的是一次匹配结果,所以没包括<div>test2</div>)
从上例可以看出:
正则一采用的贪婪模式,在匹配到第一个“</div>”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝试匹配,查看是否还有更长的可以成功匹配的子串,匹配到第二个“</div>”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为“<div>test1</div>bb<div>test2</div>”。
正则二采用的是非贪婪模式,在匹配到第一个“</div>”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“<div>test1</div>”。
更多详细介绍参考链接:
https://blog.csdn.net/lxcnn/article/details/4756030