我对backreferences 的用法感到非常困惑
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没有括号怎么办?它表示什么?
我真的搞砸了backreference,希望有人能清楚地解释
在第一种和第二种情况下,有一个单独的捕获组,即使用(...)
捕获的组,但在第一种情况下替换时,我们正确地使用了backreference,即第一个捕获组,在第二种情况下,使用了从未存在过的\2
。
举例说明
gsub("(ab)(d)", "\1 34", strings)
#[1] "^ab" "ab" "abc" "ab 34" "abe" "ab 12"
这里我们使用两个捕获组((ab)
和(d)
),在替换中,我们有第一个反向引用(\1
),后面跟着一个空格,后面跟着34。因此,在"字符串"中,这将匹配第四个元素,即"abd",为第一个反向引用(\1
)获取"ab",后跟一个空格和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*
),后跟第二个捕获组((\d+)
)中的一个或更多数字(这只与"字符串"的最后一个元素匹配)。在替换中,我们使用如上所示的第一个和第二个反向引用。