R中的反向引用

时间:2016-07-31 07:01:30

标签: r backreference

我对反向引用的使用感到非常困惑

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"

另外,为什么我在(ab)之后删除12然后它会给出这样的结果?

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

此外,如果ab没有括号怎么办?它表明了什么?

我真的搞砸了反向引用,并希望有人能够清楚地解释逻辑

1 个答案:

答案 0 :(得分:4)

在第一种和第二种情况下,有一个捕获组,即使用(...)捕获的组,但在第一种情况下,我们正确地使用反向引用,即第一个捕获组,在第二种情况下,使用了从未存在的\\2

说明一下

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

这里我们使用了两个捕获组((ab)(d)),在替换中我们有第一个反向引用(\\1),后跟一个空格后跟34。所以,在'字符串'这将匹配第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*),后跟第二个捕获组中的一个或多个数字{{1 }}(这只与'strings'的最后一个元素匹配)。在替换中,我们使用如上所示的第一个和第二个反向引用。