2012-05-10 166 views
1

混亂我寫一塊紅寶石代碼像下面一些關於非貪婪正則表達式匹配

#! /usr/bin/ruby 
    s = "[[abc]]" 
    if(s =~ /\[(.+)*?\]/) 
     puts $1 
    end 
    if(s =~ /\[(.+?)\]/) 
     puts $1 
    end 

其輸出是:

[abc 
[abc 

然後我改變變量s

s = "[[abc]]]" 

其餘部分保持不變,但現在的結果是

[abc] 
[abc 

爲什麼會發生這種情況?任何人都可以向我解釋這個嗎?

+0

我認爲這可能與差異有關在+之間?和*?這兩個非貪婪的量詞? – fabregaszy

+0

我從來沒有使用紅寶石,但你的正則表達式不是非貪婪的。 '。+'仍然最終是貪婪的。 – npinti

+0

@npinti那麼爲什麼在案例2中它不匹配[abc]],它會在貪婪的情況下做什麼? – fabregaszy

回答

3

我不確定這裏的某個人是否能夠解釋這種行爲。我檢查了Regexr,那裏的正則表現就像你期待的那樣。

\[(.+)*?\] 

僅僅是一個可怕的壞的設計表達。 (.+)*應該匹配什麼?這是嵌套量詞,它可以在許多變化中找到有效的匹配。現在更糟了,讓外部量詞懶惰,會發生什麼?

如果你想有貪婪匹配使用

\[(.+)\] 

,如果你想有懶惰匹配,使用

\[(.+?)\] 

但從來沒有窩量詞,讓他們可以找到很多可能的解決方案,這導致catastrophic backtracking,或在這裏看到一個blog post by Jeff Atwood on Coding Horror about Regex Performance