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

时间:2019-02-18 15:58:34

标签: r regex gsub

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

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

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

此代码返回给定字符串中的最后两个字符。在上面的示例中,它将返回“ at”。这是预期的结果,但是从我对正则表达式的简短介绍中,我不明白为什么这段代码会执行它的工作。

我理解的是'。*'表示查找0个或更多字符。因此,它将查看整个字符串,这将被替换。

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

所有操作都会输出实际代码作为替换,例如“。{2} $”。

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

3 个答案:

答案 0 :(得分:2)

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

说我们有一个字符串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是对组的引用。它的作用是:“用group1中的匹配文本替换整个字符串”,也就是说,.{2}$部分是替换项。

如果您不了解反斜杠,则必须引用r的语法,我无法提供更多信息。这一切都是为了逃脱。

答案 1 :(得分:2)

该正则表达式的重要部分是方括号,这就是所谓的“捕获组”。

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

答案 2 :(得分:2)

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

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

将会返回

This is a TEST

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

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

这是在正则表达式中的第一,第二或第三capture group处进行的操作。

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

说明

您的分析是正确的。

  

我理解的是'。*'表示查找0个或更多字符。因此,它将查看整个字符串,这将被替换。

     

括号中的部分在字符串末尾查找任何两个字符

最后两个字符放置在捕获组中,我们仅用该捕获组替换整个字符串。不要用任何东西代替它们。

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

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