我遇到了一篇关于正则表达式的php文章,它在语法中使用了(。*?)。到目前为止,我可以看到它的行为就像(。*)
使用(。*?)有什么好处吗?我真的不明白为什么有人会这样做。
答案 0 :(得分:8)
在大多数正则表达式中,*?
生产是非贪婪的重复。这意味着.*?
生成首先匹配空字符串,然后如果失败,则匹配一个字符,依此类推,直到匹配成功为止。相反,贪婪的生产.*
首先尝试匹配整个输入,然后如果失败,则尝试减少一个字符。
此概念仅适用于使用递归回溯来匹配模糊表达式的正则表达式引擎。从理论上讲,它们完全匹配相同的序列,但由于它们首先尝试不同的东西,所以很可能会比另一个快得多。
当使用捕获组(在递归和NFA样式引擎中同等地)从匹配操作中提取信息时,这也很有用。例如,像
这样的表达式"(.*?)"
可用于捕获带引号的字符串。由于子组不是贪婪的,因此可以确保不会捕获引号,并且子组仅包含所需的内容。
答案 1 :(得分:7)
.*
贪婪,.*?
不是。它只在上下文中有意义。鉴于模式:
<br/>(.*?)<br/>
和<br/>(.*)<br/>
以及输入<br/>test<br/>test2<br/>
,
.*
将匹配<br/>test<br/>test2<br/>
,
.*?
仅匹配<br/>test<br/>
。
注意:不要使用正则表达式来解析复杂的html。