2012-10-18 171 views
2

我經歷about_regular_expressions.rb,不明白到底這裏發生了什麼:Ruby Koans:正則表達式括號「捕獲」匹配的內容?

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Gray", $1 
    assert_equal "James", $2 
end 

似乎對我來說,在正則表達式中使用括號中的引擎蓋下創建兩個新變量(1美元和2美元)。

這是正確的嗎?

但後來我這樣做:

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Smith, Bobert", "Name: Smith, Bobert"[/(\w+), (\w+)/] 
    assert_equal "Smith", $1 
    assert_equal "Bobert", $2 
end 

它拍攝 「史密斯」 和 「Bobert」。每次使用帶括號的新正則表達式時,我想前面的值只是被覆蓋了?

如果我再嘗試捕捉只是一個字:

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Smith, Bobert", "Name: Smith, Bobert"[/(\w+), (\w+)/] 
    assert_equal "Smith", $1 
    assert_equal "Bobert", $2 
    assert_equal "Susan,", "Name: Susan, whatever"[/(\w+),/] 
    assert_equal "Susan", $1 
    assert_equal nil, $2 
end 

$ 2不見了......(沒有更多的「Bobert」)

任何人都可以擺脫對引擎蓋下會發生什麼一些輕? 或者指點我正確的方向?

回答

3

你說得對。每次匹配正則表達式時,全局變量$~, $&, ..., $1, $2, ...將被覆蓋。在你的最後一個例子中,正則表達式沒有任何東西匹配$2,因爲它沒有第二個(...)的位置,所以nil被分配爲$2

當您想交錯使用多個匹配的結果時,我使用的技術是將匹配數據保留爲變量。也就是說,在第一次正則表達式匹配後,立即分配一個變量match1 = $~。然後,繼續下一個正則表達式匹配,並執行match2 = $~,依此類推。稍後,您可以從這些變量中提取匹配的結果。例如,做幾個正則表達式匹配後,如果您想重提這是在第一次的正則表達式匹配分配$1的結果,您可以通過match1[1]調用它,等

+0

太棒了,謝謝。還有一個簡單的問題:什麼是$〜和$&?它看起來像$〜獲得下一場比賽? – Robert

+1

'$〜'包含剛剛完成的比賽的全部信息。你可以從中提取你想要的任何東西,包括所有匹配,初始位置,結束位置等。$&是與正則表達式匹配的整個子字符串。 – sawa

+0

哦,好的。再次感謝! – Robert

0

檢查:

"Name: Gray, James"[0] # => "N" 
"Name: Gray, James"[/w*/] # => "Name" 

在ruby中,可以通過索引訪問字符串,該索引可以接受多種類型的對象,也可以使用正則表達式。

看看語言reference

相關問題