我想拆分任意字符串,例如
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)的帖子中复制的除括号内的's外,按空格分割字符串,因为这个例子只是对它的扩展,在熟悉的人看来,解决方案也可以。
在单个分隔符的情况下,我可以将其粘贴到输出向量元素中,但如果同时使用多个分隔符,则拆分时会丢失它们的身份,因此我想这是行不通的。
我试图找到解决方案,使分隔符使用前瞻性和其他修改解决方案的原始帖子,但徒劳的主要是因为我缺乏理解它的解决方案。
可以使用
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匹配子串呈现平衡括号子字符串:(
匹配(
,(?:[^()]++|(?1))*
匹配零个或多个(*
) 1 +(
和)
以外的字符序列(见[^()]++
)或整个集团的整体模式1(见subrouting调用(?1)
),然后)
匹配文字)
(*SKIP)(*F)
使正则表达式丢弃整个正则表达式匹配文本的同时保持指数相匹配的末尾,然后寻找下一个匹配|
-或(?<=[^s,])(?=[s,])
-空格和逗号以外的字符与空格或逗号字符之间的位置。