按 space 拆分字符串,括号内的内容除外

Split string by space except what's inside parentheses

我有以下字符串:

x <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"
# [1] "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"

我想用 space 分隔符拆分它,避免括号内的内容,以便得到类似的东西:

[[1]]
[1] "(((K05708+K05709+K05710 K00529) K05711),K05712)"                
[2] "K05713"                          "K05714"                         
[4] "K02554"

看到两个 space 保留在第一个括号内。

我阅读了以下答案,但无法在我的案例中使用: r split on delimiter not in parenthesesUsing strsplit() in R, ignoring anything in parentheses

提前致谢!

我认为你需要一个正则表达式来匹配平衡的括号然后跳过它们,然后用以下基于 PCRE 的正则表达式匹配剩余的白色spaces:

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\s

查看 regex demo(将上面的 space 替换为 \s 以获得更好的可见性)。

图案详情:

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F) - 第 1 组匹配
    • \((?:[^()]++|(?1))*\) - 表示平衡括号子串的子串:\( 匹配 ((?:[^()]++|(?1))* 匹配零个或多个 (*) 个序列() 以外的 1+ 个字符(参见 [^()]++)或整个第 1 组的整个模式(参见子路由调用 (?1)),然后 \) 匹配文字 ) 并且 (*SKIP)(*F) 使正则表达式丢弃整个匹配的文本,同时将正则表达式索引保留在该匹配的末尾,并继续寻找下一个匹配项
  • | - 或
  • - space 分裂

这是一个online R demo:

s <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554"
strsplit(s, "(\((?:[^()]++|(?1))*\))(*SKIP)(*F)| ", perl=TRUE)

输出:

[[1]]
[1] "(((K05708+K05709+K05710+K00529) K05711),K05712)"
[2] "K05713"                                         
[3] "K05714"                                         
[4] "K02554"