我想分割如下字符串:
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?)有一个类似的问题,但我还没有能够准确地将其调整到我的场景。
答案 0 :(得分:9)
您可以使用预先确认]
之前没有[
的跟踪:
所以在R:
strsplit(x, "-(?![^[]*\\])", perl=TRUE)
-
:匹配连字符(?! )
:负向前看:如果在先前匹配的连字符之后找到该部分,则会使连字符的匹配无效。
[^[]
:匹配任何不是[
*
:匹配以前的任意数量\]
:匹配文字]
。如果匹配,则表示我们在找到]
之前找到[
。由于所有这一切都发生在负向前看,这里的匹配意味着连字符不匹配。请注意,]
是正则表达式中的特殊字符,因此必须使用反斜杠进行转义(尽管 无法逃避,因为引擎知道没有匹配的{{1}在它之前 - 但我更愿意清楚它是一个文字)。由于反斜杠在字符串文字中具有特殊含义(它们也表示转义),因此必须在此字符串中再次转义反斜杠本身,因此它显示为[
。答案 1 :(得分:4)
不是分裂,而是提取部分:
library(stringr)
str_extract_all(x, "(\\[[^\\[]*\\]|[^-])+")
答案 2 :(得分:1)
我不熟悉r
语言,但我相信它可以进行基于正则表达式的搜索和替换。我没有挣扎于单一的正则表达式分割函数,而是分三步:
-
部分中的[....]
,例如\x99
-
\x99
替换回-
第一步,您可以按\[[^]]