正则贪婪与非贪婪

19 Feb 2016 Category: 基础

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配 成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少 的匹配。

属于贪婪模式的量词,也叫做匹配优先量词,包括:

"{m,n}"、"{m,}"、"?"、"*"和"+"。

在一些使用NFA引擎的语言中,在匹配优先量词后加上”?”,即变成属于非贪婪模式的量词, 也叫做忽略优先量词,包括:

"{m,n}?"、"{m,}?"、"??"、"*?"和"+?"

区别

以字符串<div>test4567</div><div>other</div>为例

表达式<div>.*</div>,匹配的字符串<div>test4567</div><div>other</div> 表达式<div>.*?</div>,匹配的字符串<div>test4567</div> 表达式<div>\w*(\d+)</div>匹配字符串<div>test4567</div>,$1 的值7 表达式<div>\w*?(\d+)</div>匹配字符串<div>test4567</div>,$1 的值4567

说明

贪婪模式,是尽可能多的匹配数据。如果后面有其他的表达式,或者再往后会导致整体匹配 失败,则进行回溯。

非贪婪模式,尽可能少的匹配数据,在保证整体匹配成功的情况下,匹配最少的数据,回溯 多次,确保匹配结果最小。