2012-04-15 110 views
4

最近這裏一個R問題被mrdwab回答,它使用了一個非常酷的正則表達式(LINK)。我喜歡響應,但不能概括它,因爲我不明白髮生了什麼(我愚蠢的提供了不同的數值,但沒有真正產生任何有用的東西)。有人能夠逐一打破正則表達式並解釋發生了什麼?解釋這個R正則表達式

x <- c("WorkerId", "pio_1_1", "pio_1_2", "pio_1_3", "pio_1_4", "pio_2_1", 
"pio_2_2", "pio_2_3", "pio_2_4") 

gsub("([a-z])_([0-9])_([0-9])", "\\1_\\3\\.\\2", x) #Explain me please 

在此先感謝您。

回答

11

任何你有一個字符和兩個數字用下劃線分隔的地方(例如,a_1_2),正則表達式將選擇匹配的字符和數字,並使它們可用作變量。 \\1\\2,並\\3指的是相匹配的參數在原始表達式:

\\1 <- a 
\\2 <- 1 
\\3 <- 2 

運行gsub如你有以上這是搜索的表達式匹配和翻轉,無論他們出現在號碼的順序結果。因此,例如,a_1_2將變成a_2.1

"\\1_\\3\\.\\2" 
# a_ 2 . 1 
+0

第一部分真的很有用,它尋找一個字符_#_#。現在你可以添加你對'\\ 1 \\\ 3 \\。\\ 2'的解釋嗎? – 2012-04-15 16:47:03

+2

@TylerRinker這是重新排序的部分,他們被稱爲「反向引用」。第一個括號(這裏'([az])'的內容存儲在'\ 1'中,第二個的內容存儲在'\ 2'中,第三個存儲在'\ 3'中 – stema 2012-04-15 16:53:07

+2

Thanks @Stema !我也更新了答案以便嘗試和澄清,另外值得一提的是'.':在(大多數)正則表達式語言中,'.'將會匹配任何東西,轉義它會讓它呈現爲。 .well..just a dot。 – rjz 2012-04-15 16:55:20