Regexp替换 - 使用R的Sub将字符串附加到第二次出现

时间:2017-04-13 15:41:18

标签: r regex regex-group

我正在尝试将字符串附加到第二次出现。下面的代码将用静态替换字符串替换第二次出现,但我需要它是灵活的,因为匹配可以是,例如,(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

1 个答案:

答案 0 :(得分:0)

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

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)

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