在大多数正则表达式中,*?生产是非贪婪的重复.这意味着.*?生产首先匹配空字符串,然后如果失败,则匹配一个字符,依此类推,直到匹配成功为止.相反,贪婪的生产.*首先尝试匹配整个输入,然后如果失败,则尝试减少一个字符.
此概念仅适用于使用递归回溯来匹配模糊表达式的正则表达式引擎.从理论上讲,它们完全匹配相同的序列,但由于它们首先尝试不同的东西,所以很可能会比另一个快得多.
当使用捕获组(在递归和NFA样式引擎中同等地)从匹配操作中提取信息时,这也很有用.例如,一个表达式
"(.*?)"
Run Code Online (Sandbox Code Playgroud)
可用于捕获带引号的字符串.由于子组是非贪婪的,因此可以确保不会捕获任何引号,并且子组仅包含所需的内容.
.*贪心,.*?不是.它只在上下文中有意义.鉴于模式:
<br/>(.*?)<br/>而且<br/>(.*)<br/>,输入<br/>test<br/>test2<br/>,
.*会匹配<br/>test<br/>test2<br/>,
.*?只会匹配<br/>test<br/>.
注意:不要使用正则表达式来解析复杂的html.