【问题标题】:Backreference in RR中的反向引用
【发布时间】:2016-07-31 07:01:29
【问题描述】:

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

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 没有括号怎么办?说明什么?

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

【问题讨论】:

  • 它不是一个“子模式”,而是一个捕获组。如果你谷歌它,你会发现很多资源。括号() 内的任何模式都是一个捕获组。无论如何,我在您的第一个示例中没有得到相同的结果。最后一个元素是ab 34 而不是ab 12
  • 是的,你是对的,我粘贴了错误的输出。

标签: r regex gsub backreference


【解决方案1】:

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

举例说明

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

【讨论】:

  • 这更有意义。但我仍然对gsub("([a-z]+)\\s*(\\d+)", "\\2 34", strings) 感到困惑。正如您所说,它匹配“ab 12”,并且您使用 \\2 来捕获第二组。这对我来说意味着当您捕获一个组时,该组将被固定,因此“ab 12”将切换为“34 12”而不是“12 34”
  • @BrattSwan 在相关示例中,我将替换为第二个捕获组,即 (\\d+), so it returns 12` 。由于我们还创建了一个空格,后面跟着 34,它将是"12 34"。如果你想切换到“34 12”,正则表达式将是"34 \\2"
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2023-02-22
  • 2021-11-23
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多