不要说我有一个字符串:
email[1]
我想用' |'替换仅在括号之间的加号,所以我得到:
test <- "(pop+corn)-bread+salt"
我试过了:
"(pop|corn)-bread+salt"
但它取代了字符串的所有加号(显然)......
感谢您的帮助!
答案 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"