正则表达式替换 - 使用 R 的 Sub 将字符串附加到第二次出现

Regexp Replace - Append String to Second Occurrence Using R's Sub

我正在尝试将字符串附加到第二次出现的位置。下面的代码将用静态替换字符串替换第二次出现,但我需要它是灵活的,因为匹配可以是,例如,(cat|dog)。下面是我用来替换静态字符串 fish.

的内容
string <- "xxx cat xxx cat xxx cat"
sub('^((.*?cat.*?){1})cat', "\1\fish", string, perl=TRUE)

[1]'xxx cat xxx fish xxx cat'

但我想得到的是:

string <- "xxx cat xxx cat xxx cat"
sub('^((.*?(cat|dog).*?){1})(cat|dog)', "\1<span>\1</span>", string, perl=TRUE)

[1] xxx cat xxx <span>cat</span> xxx cat

string <- "xxx dog xxx dog xxx dog"
sub('^((.*?(cat|dog).*?){1})(cat|dog)', "\1<span>\1</span>", string, 

[1] xxx dog xxx <span>dog</span> xxx dog

这可能不是最有效或最简洁的正则表达式,但我发现这样更容易理解:

sub('^(.*?)(cat|dog)(.*?)(cat|dog)', '\1\2\3<span>\4</span>', string, perl=TRUE)

不需要正则表达式中的 {1}。使用您的语法(嵌套捕获组)但没有 {1},您可以使用以下内容:

sub('^(.*?(cat|dog).*?)(cat|dog)', '\1<span>\3</span>', string, perl=TRUE)

请注意,这些正则表达式不会检查两次是否匹配同一个词(汽车或狗)。