R gsub仅在括号之间替换特定字符

时间:2018-02-18 15:48:31

标签: r gsub

不要说我有一个字符串:

email[1]

我想用' |'替换仅在括号之间的加号,所以我得到:

test <- "(pop+corn)-bread+salt"

我试过了:

"(pop|corn)-bread+salt"

但它取代了字符串的所有加号(显然)......

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

如果要替换括号内的所有+符号(如果可能有1个或更多),则可以使用以下任何解决方案:

gsub("\\+(?=[^()]*\\))", "|", x, perl=TRUE)

请参阅regex demo。此处+仅在跟随()[^()]*)以及)以外的任何0 +字符后才匹配。 只有输入格式良好并且没有嵌套括号才有用,因为它不会检查是否有起始(

gsub("(?:\\G(?!^)|\\()[^()]*?\\K\\+", "|", x, perl=TRUE)

这是一个更安全的解决方案,因为它只有在有+开始时才开始匹配(。请参阅regex demo。在此模式中,(?:\G(?!^)|\()匹配上一个匹配(\G(?!^))或(|(的结尾,然后[^()]*?匹配任何其他0个字符比()个字符更快,然后\K会丢弃所有匹配的文字,而\+会匹配将被消费和替换的+。它仍然不处理嵌套括号。

另请参阅online R demo for the above two solutions

library(gsubfn)
s <- "(pop(+corn)+unicorn)-bread+salt+malt"
gsubfn("\\((?:[^()]++|(?R))*\\)", ~ gsub("+", "|", m, fixed=TRUE), s, perl=TRUE, backref=0)
## => [1] "(pop(|corn)|unicorn)-bread+salt+malt"

这解决了匹配嵌套括号的问题,但需要gsubfn包。见another regex demo。请参阅this regex description here

请注意,如果您不必匹配嵌套括号,则可以将"\\([^()]*\\)"正则表达式与上面的gsubfn代码一起使用。 \([^()]*\)正则表达式匹配(,然后匹配()以外的任何零个或多个字符(替换为[^)]*以匹配))然后)

答案 1 :(得分:1)

我们可以尝试

sub("(\\([^+]+)\\+","\\1|", test)
#[1] "(pop|corn)-bread+salt"