2016-07-31 35 views
2

我真搞不清楚反向引用向引用R中

strings <- c("^ab", "ab", "abc", "abd", "abe", "ab 12") 

gsub("(ab) 12", "\\1 34", strings) 
[1] "^ab" "ab" "abc" "abd" "abe" "ab 12" 

gsub("(ab)12", "\\2 34", strings) 
[1] "^ab" "ab" "abc" "abd" "abe" "ab 12" 

的用法我知道\ 1指的是第一個子模式(左讀),\ 2指的是第二子模式,等等。但我不知道這個子模式意味着什麼。爲什麼\ 1和\ 2給出不同的輸出

gsub("(ab)", "\\1 34", strings) 
[1] "^ab 34" "ab 34" "ab 34c" "ab 34d" "ab 34e" "ab 34 12" 

另外,爲什麼我刪除12後(ab)然後它給出了這樣的結果?

gsub("ab", "\\1 34", strings) 
[1] "^ 34" " 34" " 34c" " 34d" " 34e" " 34 12" 

此外,如果ab沒有括號?它表明什麼?

我真的搞砸了反向引用,並希望有人能夠解釋的邏輯顯然

+1

它不是一個「子模式」,而是一個*捕獲組*。如果你google了,你會發現很多資源()方括號內的任何模式都是一個捕獲組,無論如何,在第一個例子中,我沒有得到相同的結果,最後一個元素是'ab 34',而不是'ab 12' – nicola

+0

是的,你是對的,我粘貼了一個不正確的輸出。 –

回答

4

在第一和第二種情況下,只有一個捕獲組即使用(...)捕獲組,但在第一種情況下更換我們正確使用反向引用即第一個捕獲組,在第二種情況下,使用從未存在的\\2

爲了說明它

gsub("(ab)(d)", "\\1 34", strings) 
#[1] "^ab" "ab" "abc" "ab 34" "abe" "ab 12" 

這裏我們使用的是後面加一個空格,然後34所以兩個捕獲組((ab)(d)),在更換我們先反向引用(\\1),在「串「這將匹配4單元即‘ABD’,獲得‘AB’第一個反向引用(\\1),後跟一個空格和34

假設,我們做的第二個反向引用

gsub("(ab)(d)", "\\2 34", strings) 
#[1] "^ab" "ab" "abc" "d 34" "abe" "ab 12" 

的第一個被刪除,我們有「d」後跟空間和34

假設,我們用的是一般的情況下,而不是特定的字符

gsub("([a-z]+)\\s*(\\d+)", "\\1 34", strings) 
#[1] "^ab" "ab" "abc" "abd" "abe" "ab 34" 
gsub("([a-z]+)\\s*(\\d+)", "\\2 34", strings) 
#[1] "^ab" "ab" "abc" "abd" "abe" "12 34" 

注意值是如何變化在最後一個元素中,從第一個反向引用切換到第二個。使用的模式是一個或多個小寫字母(在捕獲組(([a-z]+))之後,零個或多個空格(\\s*)後跟第二個捕獲組中的一個或多個數字((\\d+)))(僅與最後一個元素匹配'strings')。在替換中,我們使用上面顯示的第一個和第二個反向引用。

+0

這樣做更有意義,但我仍然對'gsub(「([az] +)\\ s *(\\ d +)」,「\\ 2 34」,字符串)正如你所說,它匹配「ab 12」和你使用\\ 2來捕獲第二組。這意味着當你捕獲一個組時,該組將被修復,因此「ab 12」將被切換爲「34 12」,而不是「12 34」 –

+0

@BrattSwan在有關的例子中,我將用第二個捕獲組即'(\\ d +')',所以它返回'12'。由於我們還創建了一個空間,隨後是34,它將是「12 34」。如果你想切換到「34 12」,那麼正則表達式應該是「34 \\ 2」'。 – akrun