我对反向引用的使用感到非常困惑
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
),后跟一个空格,后跟34。因此,在“字符串”中,这将匹配第四个元素,即“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*
),然后是第二个捕获组((\\d+)
)中的一个或多个数字(仅与的最后一个元素匹配)在替换中,我们使用上面显示的第一个和第二个反向引用。关于r - R中的反向引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38681588/