按 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 parentheses 和
Using 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"
我有以下字符串:
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 parentheses 和 Using 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)
使正则表达式丢弃整个匹配的文本,同时将正则表达式索引保留在该匹配的末尾,并继续寻找下一个匹配项
|
- 或
这是一个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"