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 正则表达式模式中只允许以 1
到 9
开头的 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 等重用。
我想使用正则表达式在个位数月份(例如 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 正则表达式模式中只允许以 1
到 9
开头的 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 等重用。