有人可以在 gsub() 中解释这个正则表达式吗?

can someone explain this regular expression inside gsub()?

我试图理解某人在 gsub() 函数中编写的正则表达式。

在看到这段代码之前,我从未使用过正则表达式,我试图通过一些谷歌搜索来弄清楚它是如何获得最终结果的,但可以说我遇到了瓶颈。

gsub('.*(.{2}$)', '\1',"my big fluffy cat")

此代码 return 是给定字符串中的最后两个字符。在上面的示例中,它将 return "at"。这是预期的结果,但从我对正则表达式的短暂尝试来看,我不明白为什么这段代码会这样做。

我的理解是“.*”表示查找任何字符 0 次或多次。所以它将查看整个字符串,这就是将被替换的内容。

括号中的部分查找字符串末尾的任意两个字符。如果括号中的这一部分代替'\1',对我来说会更有意义。对我来说,它会读取整个字符串并将其替换为该字符串的最后两个字符。

但所做的只是输出实际代码作为替换,例如“.{2}$”。

最后我不明白为什么'\1'在函数的替换部分。对我来说,这只是说用一个反斜杠和数字 1 替换整个字符串。我说一个反斜杠是因为我的理解是第一个反斜杠只是为了使第二个反斜杠成为 none 特殊字符。

希望这些例子可以帮助你更好地理解它:

假设我们有一个字符串 foobarabcabcdef

  • .* 匹配整个字符串。

  • .*abc 它匹配:从开始匹配任何字符直到最后一个 abc (贪婪匹配),因此它匹配 foobarabcabc

  • .*(...)$ 也匹配整个字符串,但是,最后 3 个字符被分组。如果没有 () ,匹配的字符串将有一个默认组 group0,() 将是 group1, 2, 3.... 想想 .*(...)(...)(...)$ 所以我们有:

    group 0 : whole string
    group 1 : "abc" the first "abc"
    group 2 : "abc" the 2nd "abc"
    group 3 : "def" the last 3 chars
    

回到您的示例,\1 是对组的引用。它所做的是: "replace the whole string by the matched text in group1" 即 .{2}$ 部分是替换。

反斜杠看不懂,就得参考r的语法,我就不多说了。都是为了逃避。

正则表达式的重要部分是方括号,即所谓的 "capturing group"。

正则表达式 .*(.{2}$) 表示 - 匹配任何内容并捕获该行的最后 2 个字符。替换 \1 引用该组,因此它将用捕获的组替换整个匹配项,在这种情况下是最后两个字符。

对于gsub,有两种使用该函数的方法。最常见的方式大概是。

gsub("-","TEST","This is a - ")

这会 return

This is a TEST

这样做只是在正则表达式中找到匹配项并将其替换为替换字符串。

第二种使用方法 gsub 就是您描述的方法。使用 \1, \2 or \3...

它的作用是查看正则表达式中的第一个、第二个或第三个 capture group

捕获组由圆括号内的任何内容定义 ex: (capture_group_1)(capture_group_2)...

说明

你的分析是正确的。

What i understand is the '.*' means look for any character 0 or more times. So it's going to look at the entire string and this is what will be replaced.

The part in brackets looks for any two characters at the end of the string

最后两个字符放在一个捕获组中,我们只是用这个捕获组替换整个字符串。没有用任何东西替换它们。

如果有帮助,请查看此表达式的结果。

gsub('(.*)(.{2}$)', 'Group 1: \1, Group 2: \2',"my big fluffy cat")