R 中的反向引用

Backreference in R

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

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

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

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没有括号呢?它表示什么?

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

在第一种和第二种情况下,只有一个捕获组,即使用 (...) 捕获的组,但是在第一种情况下,我们正确使用反向引用进行替换,即第一个捕获组和第二个捕获组案例,使用了 \2 从未存在过。

举例说明

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

这里我们使用了两个捕获组((ab)(d)),在替换中我们有第一个反向引用(\1),然后是 space,然后是34. 因此,在 'strings' 中,这将匹配第 4 个元素,即 "abd",为第一个反向引用 (\1) 获取 "ab",然后是 space 和 34 .

假设,我们处理第二个反向引用

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

第一个被删除,我们有 "d",然后是 space 和 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]+)) 后跟零个或多个 space (\s*),然后是第二个捕获组中的一个或多个数字((\d+))(仅匹配 'strings' 的最后一个元素)。在替换中,我们使用如上所示的第一个和第二个反向引用。