2017-04-25 5 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/

値[4za] AX/BY BY

どうすればいいですか?

答えて

24

ネガティブなビヘイビア((?<!...))を使用してください。次の正規表現の手段 "/ブラケットを開くことによって、先行していない":

(?<!\[.*)/ 

Demo

C#のデモ:https://dotnetfiddle.net/85S3cK

+1

をFYI:文字列は改行が含まれている場合は、正規表現エンジンに単一行(「DOTALL」)オプションを渡すために役に立つかもしれません、 '@ (?<!\ [。*)/ "、RegexOptions.Singleline);'(?<!\ [。*)/] 'または' Regex.Split(stringVar、@ " –

+0

エンジンが任意の長さのlookbehindをサポートしていない場合は? –

+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

これは問題ありませんが、1ライナーはそれほど悪くなく、十分に読みやすいです。 –

関連する問題