支持嵌套括号场景:如何编写正则匹配非括号内的分号并替换为逗号
嵌套括号场景下替换外层分号的解决方案
问题根源
你原先使用的正则;(?![^(]*\))仅支持单层括号的判断逻辑:它只会检查分号后面是否存在「没有左括号跟随的右括号」,遇到嵌套括号时,外层括号内部的分号后方会出现嵌套的左括号,导致规则误判该分号处于括号外,触发错误替换。
正确实现代码
R语言中使用支持递归匹配的Perl正则即可实现任意层数嵌套括号的判断:
# 注意字符串需要用引号包裹 x <- "Almonds ; Roasted Peanuts (Peanuts; Canola Oil (Antioxidants (319; 320)); Salt); Cashews " result <- gsub(";(?=(?:[^()]|\\((?1)\\))*$)", ",", x, perl = TRUE)
运行后输出结果和要求完全一致:
[1] "Almonds , Roasted Peanuts (Peanuts; Canola Oil (Antioxidants (319; 320)); Salt), Cashews "
正则逻辑说明
新正则的核心是通过递归匹配判断分号是否处于括号外:只有分号之后的所有括号完全成对闭合时,才判定该分号不属于任何括号内部,执行替换:
;匹配待判断的分号(?=(?:[^()]|\((?1)\))*$)是正向肯定前瞻,校验分号后方的字符规则:[^()]匹配所有非括号字符\((?1)\)是递归匹配规则,支持匹配任意层数的完整嵌套括号*$要求上述规则匹配到字符串末尾,确保分号后方的括号完全平衡,没有未闭合的左括号
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

