我试图了解某人在gsub()函数中编写的正则表达式。
在看到这段代码之前,我从未使用过正则表达式,并且我试图通过谷歌搜索来弄清楚它是如何获得最终结果的,但是可以这么说。
gsub('.*(.{2}$)', '\\1',"my big fluffy cat")
此代码返回给定字符串中的最后两个字符。在上面的示例中,它将返回“ at”。这是预期的结果,但是从我对正则表达式的简短介绍中,我不明白为什么这段代码会执行它的工作。
我理解的是'。*'表示查找0个或更多字符。因此,它将查看整个字符串,这将被替换。
括号中的部分在字符串末尾查找任何两个字符。如果括号中的该部分代替“ \ 1”,对我来说更有意义。对我来说,它将阅读整个字符串,并将其替换为该字符串的最后两个字符。
所有操作都会输出实际代码作为替换,例如“。{2} $”。
最后我不明白为什么'\ 1'在函数的替换部分。对我来说,这只是说要用一个反斜杠和数字1替换整个字符串。我说一个反斜杠是因为我的理解是第一个反斜杠就在其中,从而使第二个反斜杠成为一个非特殊字符。
答案 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")