一种不同的方法:
添加到@ 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重复到无穷大时间(
*
),但尽可能少(?
),即.
被懒惰地评估任何字符(.
) 。
- 先前
.
重复然后通过第一右括号(\\)
)限定,
- 后跟另一个集合中的任何字符的在端部具有a
\\K
重复0到尽可能少(.*?
)
- ,这将引发到目前为止的比赛,并设置了一场新的比赛的起点。
- 先前
.*?
由捕获组((...)
)与|
,要么
- 选择一个实际的文本串,
,
限定,
- 或移动
\\K
到线路,$
的结束时,如果有没有更多的逗号。
*呼*
如果我的解释是混乱的,看到上面链接的文档,并检查了regex101.com,在那里你可以在上面放正则表达式(单逃脱 - \
- 代替R风格的双转义 - \\
)和一个测试字符串,以查看它匹配的内容并获得它在做什么的解释。您需要在正则表达式框旁边的框中设置g
(全局)修饰符,以显示所有匹配,而不仅仅显示第一个匹配。
快乐strsplit
ing!
您尝试使用大括号'(...)'作为不可分割的块范围,并且必须将您的意图放入分割正则表达式中。这不是一个简单的任务。 – huckfinn