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

问题描述

我想使用正则表达式在单位数字月份(例如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正则表达式模式中仅允许从19的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等重用。