我正在尝试将字符串附加到第二次出现。下面的代码将用静态替换字符串替换第二次出现,但我需要它是灵活的,因为匹配可以是,例如,(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
答案 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)
请注意,这些正则表达式不会检查相同的单词(汽车或狗)是否匹配两次。