如何在方括号外用短划线拆分字符串

时间:2017-09-07 09:07:17

标签: r regex

我想分割如下字符串:

x <- "abc-1230-xyz-[def-ghu-jkl---]-[adsasa7asda12]-s-[klas-bst-asdas foo]"

by dash(-),条件是这些破折号不得包含在[]对中。预期的结果是

c("abc", "1230", "xyz", "[def-ghu-jkl---]", "[adsasa7asda12]", "s",
     "[klas-bst-asdas foo]")

注意:

  • 彼此之间没有方括号的嵌套。
  • 方括号可以包含除方括号外的任何字符/数字/符号。
  • 字符串的其他部分也是可变的,因此我们只能假设-只有[]不在TCP handshakes内。{/ li>

对于python(How to split a string by commas positioned outside of parenthesis?)有一个类似的问题,但我还没有能够准确地将其调整到我的场景。

3 个答案:

答案 0 :(得分:9)

您可以使用预先确认]之前没有[的跟踪:

-(?![^[]*\])

所以在R:

strsplit(x, "-(?![^[]*\\])", perl=TRUE)

说明:

  • -:匹配连字符
  • (?! ):负向前看:如果在先前匹配的连字符之后找到该部分,则会使连字符的匹配无效。
    • [^[]:匹配任何不是[
    • 的字符
    • *:匹配以前的任意数量
    • \]:匹配文字]。如果匹配,则表示我们在找到]之前找到[。由于所有这一切都发生在负向前看,这里的匹配意味着连字符匹配。请注意,]是正则表达式中的特殊字符,因此必须使用反斜杠进行转义(尽管 无法逃避,因为引擎知道没有匹配的{{1}在它之前 - 但我更愿意清楚它是一个文字)。由于反斜杠在字符串文字中具有特殊含义(它们也表示转义),因此必须在此字符串中再次转义反斜杠本身,因此它显示为[

答案 1 :(得分:4)

不是分裂,而是提取部分:

library(stringr)
str_extract_all(x, "(\\[[^\\[]*\\]|[^-])+")

答案 2 :(得分:1)

我不熟悉r语言,但我相信它可以进行基于正则表达式的搜索和替换。我没有挣扎于单一的正则表达式分割函数,而是分三步:

  • 使用不可见的字符替换所有-部分中的[....],例如\x99
  • -
  • 拆分
  • 对于上述拆分结果(数组/列表)中的每个元素,将\x99替换回-

第一步,您可以按\[[^]]

找到这些部分