解释一下这个R正则表达式

4

最近,mrdwab回答了一个使用了非常酷的正则表达式的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

提前感谢您。

1个回答

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

第一部分非常有用,因为它正在查找一个字符_#_#。现在,你能否进一步解释一下 \\1_\\3\\.\\2 - Tyler Rinker
2
@TylerRinker 那是重新排序的部分,它们被称为“反向引用”。第一个括号(这里是 ([a-z]))中的内容存储在 \1 中,第二个中的内容存储在 \2 中,第三个……依此类推。 - stema
2
谢谢@Stema!我还更新了答案以尝试澄清。值得一提的另一件事是在“.”上的转义:在(大多数)正则表达式语言中,“.”将匹配任何内容。转义它将使它呈现为...嗯...只是一个点。 - rjz
4
目前还没有人特别提到,但是每个元素周围的括号才是允许反向引用的原因。 (.)([A-z]) 允许使用 \1 和 \2。如果整个正则表达式外面再加上一组括号 ((.)([A-z])),那么你还将有第三个 \1 = (.) \2 = ([A-z]) \3 = ((.)([A-z]))。希望这能帮到你。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接