R中的正则表达式,在替换中重用匹配的字符串

regular expression in R, reuse matched string in replacement

我想使用正则表达式在个位数月份(例如 2020M6 到 2020M06)前插入一个 '0'。 下面的那个正确地匹配了我需要替换的字符串('M' 之后字符串末尾的一个数字,不包括 'M'),但替换模式 '0[=14=]' 按字面解释为R;在其他地方(matlab 中的 regeprep)我通过 '[=16=]'.

在示例中引用了匹配的字符串 '6'
sub('(?<=M)([0-9]{1})$','0[=10=]', c('2020M6','2020M10'), perl = T)
[1] "2020M0[=10=]" "2020M10"

我找不到如何在替换模式中引用和重新使用匹配的字符串。

PS: 有其他方法可以完成任务,但我需要使用正则表达式。

遗憾的是,无法在基本 R 正则表达式函数中使用对整个匹配项的反向引用。

您可以使用

sub("(M)([0-9])$", "\10\2", x)

使用像这里这样的 TRE 正则表达式,您不必担心反向引用后的数字,因为在 TRE 正则表达式模式中只允许以 19 开头的 9 个反向引用。有趣的是,您可以在上面的代码行中使用 perl=TRUE,它会产生相同的结果。

参见 R demo online:

x <-  c('2020M6','2020M10')
sub("(M)([0-9])$", "\10\2", x)
## => [1] "2020M06" "2020M10"

另请参阅 regex demo

我认为您必须捕获 'M' 之后的数字而不是 'M' 本身,因此:

sub('(?<=M)([0-9]{1})$','0\1', c('2020M6','2020M10'), perl = T)

顺便说一下,捕获的字符串可以与 \\1、\\2 等重用。