我想分割任意字符串,例如
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 ) 帖子复制而来 Split string by space except what's inside parentheses ,因为这个例子只是它的一个扩展,并且在了解的人手中,解决方案也可以是这样。
在使用单个分隔符的情况下,我可以将其粘贴到输出向量元素中,但是对于多个同时分隔符,它们的标识在分割时会丢失,所以据我所知这是行不通的。
我试图找到使用前瞻和对原始帖子的解决方案进行其他修改来保持分隔符的解决方案,但主要是徒劳的,因为我缺乏对其解决方案的理解。
最佳答案
你可以使用
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,])
,参见its demo online .
详细信息:
-
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)
- 第 1 组匹配呈现平衡括号子字符串的子字符串:\(
匹配(
,(?:[^()]++|(?1))*
匹配除*
之外的零个或多个 ((
) 1+ 个字符的序列和)
(参见[^()]++
)或整个组 1 的整个模式(参见子路由调用(?1)
),然后\)
匹配文字)
和(*SKIP)(*F)
使正则表达式丢弃整个匹配的文本,同时将正则表达式索引保留在该匹配的末尾,然后继续查找下一个匹配 -
|
- 或 -
(?<=[^\s,])(?=[\s,])
- 除空格和逗号之外的字符与空格或逗号字符之间的位置。
关于r - 使用分隔符分割字符串(括号中除外),并保留分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69153079/