2017-04-25 65 views
14

我想分割以下一種字符串:斯普利特 '/' 直到 '[' 出現

父/子/值[4za] AX/BY

並獲得創建String[]出它通過:

String[] ArrayVar = Regex.Split(stringVar, "?"); 

其中[第一齣現之前通過分割每/的字符串。

因此,作爲結果,我會得到

Array[0] => "Parent" 
Array[1] => "Child" 
Array[2] => "Value [4za] AX/BY" 

串還可能​​有其他格式,如

父/值[4za] AX/BY

值[4za] AX/BY

我該怎麼做?

回答

24

使用負向後視((?<!...))。下面的正則表達式的意思是 「/不打開支架之前」:

(?<!\[.*)/ 

Demo

C#演示:https://dotnetfiddle.net/85S3cK

+1

FYI:如果字符串包含換行符,它可能是有用的選項,通過一個單線(「DOTALL」)的正則表達式引擎,'@ 「(?s)(?<!\ [。*)/」'或'Regex.Split(stringVar,@「(?<!\ [。*)/」,RegexOptions.Singleline);'。 –

+0

如果引擎不支持任意長度的lookbehinds? –

+0

@QPaysTaxes,沒有任意長度的lookbehinds,單個正則表達式語句要麼是不可能的,要麼是太複雜,不值得花費在像TheLethalCoder的答案這樣的解決方案上。 – asgallant

33

你可以使用普通的字符串操作來做到這一點。只需將字符串拆分爲第一個[,然後相應地拆分。然後,只需添加字符串的結尾部分到最後一個元素:

string inputstring = "Parent/Child/Value [4za] AX/BY"; 

int index = inputstring.IndexOf('['); 

string[] parts = inputstring.Substring(0, index).Split('/'); 
parts[parts.Length - 1] += inputstring.Substring(index); 
+1

如果沒有編譯'Regex',那麼這個方法實際上可能會更快。 – Pharap

+3

即使編譯正則表達式,這可能會更快。 – Mardoxx

+0

這很好,但單線並不差,並且足夠可讀。 –