免得说我有一个字符串:
test <- "(pop+corn)-bread+salt"
Run Code Online (Sandbox Code Playgroud)
我想用“|”替换仅在括号之间的加号,所以我得到:
"(pop|corn)-bread+salt"
Run Code Online (Sandbox Code Playgroud)
我试过:
gsub("([+])","\\|",test)
Run Code Online (Sandbox Code Playgroud)
但它替换了字符串的所有加号(显然)
如果要替换+括号内的所有符号(如果可能有 1 个或多个),可以使用以下任一解决方案:
gsub("\\+(?=[^()]*\\))", "|", x, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。此处,+仅当 后面跟有除(and之外的任何 0+ 字符)(带有[^()]*)然后是 时才匹配)。仅当输入格式良好并且没有嵌套括号时才好,因为它不检查是否有起始(.
gsub("(?:\\G(?!^)|\\()[^()]*?\\K\\+", "|", x, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
这是一个更安全的解决方案,因为它+仅在存在起始 时才开始匹配(。请参阅正则表达式演示。在此模式中,匹配上一个匹配 ( ) 或 ( ) a(?:\G(?!^)|\()的结尾,然后匹配除和字符之外的任何 0+ 字符,然后丢弃所有匹配的文本并匹配将被消耗和替换的a 。它仍然不处理嵌套括号。\G(?!^)|([^()]*?()\K\++
另外,请参阅上述两个解决方案的在线 R 演示。
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"
Run Code Online (Sandbox Code Playgroud)
这解决了匹配嵌套括号的问题,但是需要gsubfn包。请参阅另一个正则表达式演示。请参阅此处的正则表达式说明。
请注意,如果您不必匹配嵌套括号,则可以在上面的代码"\\([^()]*\\)"中使用正则表达式gsubfn。\([^()]*\)正则表达式匹配,然后是除和(以外的任何零个或多个字符(替换为匹配),然后是.()[^)]*))