正则表达式 。*? vs。*

时间:2011-02-06 23:20:08

标签: php regex

我遇到了一篇关于正则表达式的php文章,它在语法中使用了(。*?)。到目前为止,我可以看到它的行为就像(。*)

使用(。*?)有什么好处吗?我真的不明白为什么有人会这样做。

2 个答案:

答案 0 :(得分:8)

在大多数正则表达式中,*?生产是非贪婪的重复。这意味着.*?生成首先匹配空字符串,然后如果失败,则匹配一个字符,依此类推,直到匹配成功为止。相反,贪婪的生产.*首先尝试匹配整个输入,然后如果失败,则尝试减少一个字符。

此概念仅适用于使用递归回溯来匹配模糊表达式的正则表达式引擎。从理论上讲,它们完全匹配相同的序列,但由于它们首先尝试不同的东西,所以很可能会比另一个快得多。

当使用捕获组(在递归和NFA样式引擎中同等地)从匹配操作中提取信息时,这也很有用。例如,像

这样的表达式
"(.*?)"

可用于捕获带引号的字符串。由于子组不是贪婪的,因此可以确保不会捕获引号,并且子组仅包含所需的内容。

答案 1 :(得分:7)

.*贪婪,.*?不是。它只在上下文中有意义。鉴于模式:

<br/>(.*?)<br/><br/>(.*)<br/>以及输入<br/>test<br/>test2<br/>

.*将匹配<br/>test<br/>test2<br/>

.*?仅匹配<br/>test<br/>

注意:不要使用正则表达式来解析复杂的html。