如何移除字符串中不在括号内的所有"J."实例?
解决方案:移除括号外的"J."
要实现只删除字符串中不在括号内的"J.",可以利用R的正则表达式支持PCRE递归匹配的特性,精准跳过括号内的内容,只替换目标字符串。
实现代码
# 初始文本 text = "This is J. one instance and J. another (this one should stay J.) but this one should go J. (and stay J.) (and stay J. and stay J.) and go J." # 执行替换 result = gsub("\\((?:[^()]|(?R))*\\)(*SKIP)(*FAIL)|J\\.", "", text, perl = TRUE) # 输出结果 cat(result)
输出结果
This is one instance and another (this one should stay J.) but this one should go (and stay J.) (and stay J. and stay J.) and go
正则逻辑说明
\((?:[^()]|(?R))*\):匹配所有括号内的内容(包括嵌套括号),确保这部分内容不会被修改(*SKIP)(*FAIL):标记括号内的匹配结果为无效,让正则引擎跳过这部分,不参与后续替换|J\.:匹配所有不在括号内的"J.",并替换为空字符串
你之前的gsub组合逻辑有缺陷,只处理了开头到第一个括号、以及括号后的部分,导致误删了括号外的其他文本,而上面的方法可以精准定位需要删除的目标,保留所有其他内容。
内容的提问来源于stack exchange,提问作者user17661126
相关产品推荐
相关产品推荐

