Regex 在R中使用strsplit(),忽略括号中的任何内容

Regex 在R中使用strsplit(),忽略括号中的任何内容,regex,r,strsplit,Regex,R,Strsplit,我试图在R中使用strsplit()来根据逗号将字符串拆分为几段,但我不想在括号中拆分任何内容。我认为答案是一个正则表达式,但我正在努力使代码正确 例如: x <- "This is it, isn't it (well, yes)" > strsplit(x, ", ") [[1]] [1] "This is it" "isn't it (well" "yes)" 我们可以使用PCREregex来FAIL任何,后面是(前面是),然后按,和0或更多的空格(\\s*)分割

我试图在R中使用
strsplit()
来根据逗号将字符串拆分为几段,但我不想在括号中拆分任何内容。我认为答案是一个正则表达式,但我正在努力使代码正确

例如:

x <- "This is it, isn't it (well, yes)"
> strsplit(x, ", ")
[[1]]
[1] "This is it"     "isn't it (well" "yes)" 

我们可以使用
PCRE
regex来
FAIL
任何
后面是
前面是
,然后按
和0或更多的空格(
\\s*
)分割


我建议另一个带有
(*SKIP)(*F)
的正则表达式忽略所有
(…)
子字符串,只匹配括号外的逗号:

x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)"
strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T)
x另一种方法:

添加到@Wiktor的示例字符串中

x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
那么
,|(?>\(.*?\\).\\K(,|$)
是如何匹配的呢

  • |
    捕获两侧的任意一个组
    • 左边是字符串
    • 在右边,
      (?>\(.*?\).*?\\K(,|$)
      • (?>…)
        设置,不允许回溯重新评估匹配的内容
      • 在本例中,它查找一个开括号(
        \\(
      • 然后,从0到无限次(
        *
        )重复的任何字符(
        ),但尽可能少(
        ),即
        )被延迟计算
      • 然后,前面的
        重复受到第一个右括号(
        \\)
        的限制
      • 后跟另一组重复0到尽可能少的任意字符(
        *?
      • 在比赛结束时,这场比赛已经结束,并为新的比赛设定了起点
      • 前面的
        *?
        受到捕获组(
        (…)
        )的限制,捕获组的
        |
        • 选择实际的文本字符串,
        • 如果没有更多逗号,则将
          \\K
          移动到行尾
          $
*呼*

如果我的解释令人困惑,请参阅上面链接的文档,然后查看,您可以在其中输入上述正则表达式(单转义-
\
-而不是R样式的双转义-
\\
)和测试字符串,以查看它匹配的内容,并获得它所做操作的解释。您需要在正则表达式框旁边的框中设置
g
(全局)修饰符,以显示所有匹配项,而不仅仅是第一个匹配项


快乐
strsplit
ing

您尝试将大括号
(…)
用作不可拆分的块作用域,并且必须将您的意图放入拆分regexp中。这不是一个简单的任务。你劫持了斯特里比雪夫的帐户吗?o_O@BhargavRao当前位置这是我的帐户,我刚刚更改了名称。你可以每月做一次,所以:)这太棒了。谢谢非常有用。谢谢
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)"
strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T)
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?"