如何按多分隔符拆分括号外的字符串且保留原分隔符
解决方案
你可以用支持递归匹配的Perl正则实现需求,无需手动拼接分隔符,自动识别并保留括号外的逗号、空格两种分隔符,同时跳过括号内的所有分隔符。
代码实现
首先准备示例输入:
x <- "(((K05708+K05709+K05710+K00529) K05711),K05712),K05713 K05714 K02554"
方法1:使用stringr包实现(写法更简洁)
library(stringr) # 核心匹配逻辑 split_res <- str_extract_all(x, perl("(?>[^(), ]+|\\((?R)*\\))+|[ ,](?>[^(), ]+|\\((?R)*\\))*"))
方法2:使用base R实现(无需额外安装包)
pattern <- "(?>[^(), ]+|\\((?R)*\\))+|[ ,](?>[^(), ]+|\\((?R)*\\))*" split_res <- regmatches(x, gregexpr(pattern, x, perl = TRUE))
输出验证
运行后得到的结果和你给出的预期输出完全一致:
split_res #> [[1]] #> [1] "(((K05708+K05709+K05710+K00529) K05711),K05712)" #> [2] ",K05713" #> [3] " K05714" #> [4] " K02554"
逻辑说明
正则通过(?R)递归匹配嵌套的括号结构,保证括号内的逗号、空格不会被识别为拆分点,两个匹配分支分别处理:
- 第一个片段:从字符串开头到第一个括号外分隔符的完整内容,包含所有配对括号
- 后续片段:以分隔符(逗号/空格)开头,匹配到下一个括号外分隔符前的全部内容,自动保留原分隔符类型
该方法适配任意层数的嵌套括号,也支持扩展更多分隔符类型,只需要在正则的[ ,]位置增加你需要的分隔符即可。
内容的提问来源于stack exchange,提问作者yuppe
相关产品推荐
相关产品推荐

