2011-02-06 98 views
4

我遇到了一篇關於在其語法中使用(。*?)的正則表達式的php文章。至於我可以看到它的行爲就像(。*)正則表達式。*? vs。*

使用(。*?)有什麼好處嗎?我不明白爲什麼有人會使用它。

+3

他們的行爲不同。 – BoltClock 2011-02-06 23:22:46

+2

這是誰說的:「在編程中,有時你會遇到問題,然後用正則表達式來解決這個問題,現在你有兩個問題。」? – makdad 2011-02-06 23:27:06

+1

@phooze:每個人。 – 2011-02-07 03:37:31

回答

7

.*很貪心,.*?不是。它只在上下文中有意義。鑑於模式:

<br/>(.*?)<br/><br/>(.*)<br/>,輸入<br/>test<br/>test2<br/>

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

.*?將只匹配<br/>test<br/>

注意:永遠不要使用正則表達式來解析複雜的html。

8

在最正宗的正則表達式中,*?的產生是非貪婪的重複。這意味着.*?產品首先匹配空字符串,然後如果失敗,則返回一個字符,直到匹配成功。相反,貪婪的生產.*首先嚐試匹配整個輸入,然後如果失敗,則嘗試減少一個字符。

該概念僅適用於使用遞歸回溯來匹配模糊表達式的正則表達式引擎。從理論上說,它們的配搭完全相同,但是由於它們先嚐試了不同的東西,它可能會比另一個更快。

當捕獲組(使用遞歸和NFA樣式引擎平等)用於從匹配操作中提取信息時,這也會很有用。例如,像

"(.*?)" 

可用於捕獲帶引號的字符串。由於子組非貪婪,因此可以確保不會引用任何引號,並且子組僅包含所需的內容。