簡體   English   中英

如何在方括號外用短划線拆分字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM