我对反向引用的使用感到非常困惑
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"
Run Code Online (Sandbox Code Playgroud)
我知道\ 1表示第一个子模式(从左侧读取),\ 2表示第二个子模式,依此类推。但是我不知道这个子模式是什么意思。为什么\ 1和\ 2给出不同的输出
gsub("(ab)", "\\1 34", strings)
[1] "^ab 34" "ab 34" "ab 34c" "ab 34d" "ab 34e" "ab 34 12"
Run Code Online (Sandbox Code Playgroud)
另外,为什么我在(ab)之后删除12,然后得到这样的结果?
gsub("ab", "\\1 34", strings)
[1] "^ 34" " 34" " 34c" " 34d" " 34e" " 34 12"
Run Code Online (Sandbox Code Playgroud)
此外,如果ab没有括号怎么办?它表示什么?
我真的搞砸了反向引用,希望有人可以清楚地解释逻辑
在第一种和第二种情况下,有一个捕获组,即使用捕获的组(...),但是在第一种情况下,我们正确地使用了反向引用,即第一个捕获组,在第二种情况下,使用\\2了不存在的捕获组。
为了说明
gsub("(ab)(d)", "\\1 34", strings)
#[1] "^ab" "ab" "abc" "ab 34" "abe" "ab 12"
Run Code Online (Sandbox Code Playgroud)
这里我们使用两个捕获组((ab)和(d)),在替换中,我们有第一个反向引用(\\1),后跟一个空格,后跟34。因此,在“字符串”中,这将匹配第四个元素,即“ abd”,获得“ ab”第一个反向引用(\\1),后跟一个空格和34。
假设我们使用第二个反向引用
gsub("(ab)(d)", "\\2 34", strings)
#[1] "^ab" "ab" "abc" "d 34" "abe" "ab 12"
Run Code Online (Sandbox Code Playgroud)
第一个被删除,我们有“ 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"
Run Code Online (Sandbox Code Playgroud)
注意如何通过从第一个反向引用切换到第二个反向引用来更改最后一个元素中的值。所使用的模式是一个或多个小写字母(在捕获组(([a-z]+))中,后面是零个或多个空格(\\s*),然后是第二个捕获组((\\d+))中的一个或多个数字(仅与“字符串”的最后一个元素匹配) )。在替换中,我们使用上面显示的第一个和第二个反向引用。