2012-04-15 113 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