我试图用分号替换所有括号内的逗号,但不更改括号外的任何逗号.
所以,例如:
"a, b, c (1, 2, 3), d, e (4, 5)"
Run Code Online (Sandbox Code Playgroud)
应成为:
"a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)
我已经开始尝试使用gsub,但我很难理解/弄清楚如何识别括号内的逗号.
我会称自己是R的高级初学者,但是使用正则表达式和文本操作,一个总的菜鸟.你能提供的任何帮助都会很棒.
最简单的解决方案
在所有括号均衡的情况下,最常见的解决方法是:
,(?=[^()]*\))
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
正则表达式匹配......
, - 逗号如果......(?=[^()]*\))- 后跟0或更多字符,(或者)(和[^()]*)和字面值).替代方案
如果您需要确保替换最近的打开和关闭括号内的逗号,则使用gsubfn基于方法更安全:
a <- "a, b, c (1, 2, 3), d, e (4, 5)"
gsub(",(?=[^()]*\\))", ";", a, perl=T)
## [1] "a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)
在这里,\(([^()]*)\)匹配(,然后是除了(和之后的0+字符),然后)将match找到的内容传递给匿名函数,其中所有,字符都用半冒号替换gsub.
如果您需要在具有未知级别深度的平衡括号内执行此替换,请使用PCRE正则表达式gsubfn:
library(gsubfn)
x <- 'a, b, c (1, 2, 3), d, e (4, 5)'
gsubfn('\\(([^()]*)\\)', function(match) gsub(',', ';', match, fixed=TRUE), x, backref=0)
## => [1] "a, b, c (1; 2; 3), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)
图案细节
x1 <- 'a, b, c (1, (2, (3, 4)), 5), d, e (4, 5)'
gsubfn('\\(((?:[^()]++|(?R))*)\\)', function(match) gsub(',', ';', match, fixed=TRUE), x1, backref=0, perl=TRUE)
## => [1] "a, b, c (1; (2; (3; 4)); 5), d, e (4; 5)"
Run Code Online (Sandbox Code Playgroud)