![](/img/trans.png)
[英]Regex to split string by character and retaining content inside square brackets
[英]How to split a string by dashes outside of square brackets
我想分割如下字符串:
x <- "abc-1230-xyz-[def-ghu-jkl---]-[adsasa7asda12]-s-[klas-bst-asdas foo]"
通過破折號( -
),條件是這些破折號不得包含在一對[]
。 預期的結果是
c("abc", "1230", "xyz", "[def-ghu-jkl---]", "[adsasa7asda12]", "s",
"[klas-bst-asdas foo]")
筆記:
-
只要它不在[]
內部。 python有一個類似的問題( 如何用括號外的逗號分割字符串? )但是我還沒有准確地將它調整到我的場景。
您可以使用向前看來驗證沒有比[
: ]
更快的跟蹤
在R中:
strsplit(x, "-(?![^[]*\\])", perl=TRUE)
-
:匹配連字符 (?! )
:負向前看:如果在先前匹配的連字符之后找到該部分,則使連字符的匹配無效。
[^[]
:匹配任何不是[
*
:匹配以前的任意數量 \\]
:匹配文字]
。 如果這匹配,則意味着我們在找到[
之前]
找到了一個。 由於所有這一切都發生在負向前看,這里的匹配意味着連字符不匹配。 請注意,a ]
是正則表達式中的特殊字符,因此必須使用反斜杠進行轉義(盡管它可以在沒有轉義的情況下工作,因為引擎知道沒有匹配[
它之前 - 但我更願意清楚它是正確的一個文字)。 並且由於反斜杠在字符串文字中具有特殊含義(它們也表示轉義),反斜杠本身必須在此字符串中再次轉義,因此它顯示為\\\\]
。 而不是分裂,提取部分:
library(stringr)
str_extract_all(x, "(\\[[^\\[]*\\]|[^-])+")
我不熟悉r
語言,但我相信它可以進行基於正則表達式的搜索和替換。 我沒有掙扎於單一的正則表達式分割函數,而是分三步:
-
在所有[....]
部分中由一個不可見的字符,如\\x99
-
\\x99
替換回-
對於第一步,您可以通過\\[[^]]
找到這些部件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.