问题描述
我想使用正则表达式在单位数字月份(例如2020M6至2020M06)之前插入'0'
。
下面的一个正确匹配了我需要替换的字符串('M'
之后的字符串末尾的一位数字,不包括'M'
),但是替换模式'0$0'
的字面含义为R;在其他地方(matlab中的regeprep),我通过'6'
'引用了匹配的字符串,在示例中为'$0
。
sub('(?<=M)([0-9]{1})$','0$0',c('2020M6','2020M10'),perl = T)
[1] "2020M0$0" "2020M10"
我找不到如何在替换模式中引用和重复使用匹配的字符串。
PS:有其他方法可以完成任务,但是我需要使用正则表达式。
解决方法
不幸的是,在基本R regex函数中无法对整个匹配使用反向引用。
您可以使用
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])$",x)
## => [1] "2020M06" "2020M10"
另外,请参见regex demo。
,我认为您必须捕获'M'之后的数字,而不是'M'本身,因此:
sub('(?<=M)([0-9]{1})$','0\\1',c('2020M6','2020M10'),perl = T)
捕获的字符串可以用\\ 1,\\ 2等重用。