2

我想拆分任意字符串,例如

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

在分隔符处(此处为空格和逗号),除非它们在括号内,并且还将分隔符保留为输出的一部分

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

这个例子几乎是直接从 IgnacioF 的 ( https://stackoverflow.com/users/5935889/ignaciof ) 帖子 中复制的,除了括号内的内容外,按空格分割字符串,因为这个例子只是对它的扩展,并且在了解的情况下,解决方案可以也是。

在单个定界符的情况下,我可以将其粘贴到输出向量元素中,但是对于多个同时定界符,它们的身份在拆分时会丢失,所以 AFAIK 这不起作用。

我试图找到使用前瞻和对原始帖子的解决方案进行其他修改来保持分隔符的解决方案,但徒劳无功,主要是因为我缺乏对其解决方案的理解。

4

1 回答 1

3

您可以使用

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

这里的模式是(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|(?<=[^\s,])(?=[\s,]),在线查看它的演示

详情

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F)-组1匹配呈现平衡括号子字符串的子字符串:\(匹配 a ,(匹配零(?:[^()]++|(?1))*个或多个(一个文字并使正则表达式丢弃整个匹配的文本,同时将正则表达式索引保持在该匹配的末尾,并继续寻找下一个匹配*()[^()]++(?1)\))(*SKIP)(*F)
  • |- 或者
  • (?<=[^\s,])(?=[\s,])- 在除空格和逗号以外的字符与空格或逗号字符之间的位置。
于 2021-09-12T16:17:58.670 回答