另一种方法:
添加到@Wiktor 的示例字符串,
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
现在是魔法:
> strsplit(x, ", |(?>\\(.*?\\).*?\\K(, |$))", perl = TRUE)
[[1]]
[1] "This is it"
[2] "isn't it (well, yes)"
[3] "and (well, this, that, and this, too). Let's look"
[4] "does it work?"
那么, |(?>\\(.*?\\).*?\\K(, |$)) 是如何匹配的呢?
-
| 捕获任一侧的任一组,两者
- 在左边,字符串
,
- 在右边,
(?>\\(.*?\\).*?\\K(, |$)):
-
(?> ... ) 设置 an atomic group,不允许回溯重新评估匹配的内容。
- 在这种情况下,它会查找左括号 (
\\(),
- 然后任何字符 (
.) 从 0 到无限次重复 (*),但尽可能少 (?),即 . 被延迟评估。
- 先前的
. 重复随后被第一个右括号 (\\)) 限制,
- 后面是另一组重复 0 到尽可能少的任意字符 (
.*?)
- 以a
\\K 结尾,这会丢弃到目前为止的匹配并设置新匹配的起点。
- 以前的
.*? 受捕获组(( ... ))的限制,| 要么
- 选择一个实际的文本字符串,
,,
- 或将
\\K 移动到行尾$(如果没有更多逗号)。
*哇哦。*
如果我的解释令人困惑,请参阅上面链接的文档,并查看regex101.com,您可以在其中输入上述正则表达式(单转义-\-而不是R 样式的双转义-\\)和一个测试字符串,看看它匹配什么,并得到它在做什么的解释。您需要在正则表达式框旁边的框中设置 g(全局)修饰符以显示所有匹配项,而不仅仅是第一个。
快乐strspliting!