2017-04-25 11 views
14

ipi aşağıdaki türde bölmek istediğiniz görünür String[] yoluyla bunun dışında: [ ilk ortaya çıkmasından önce her / tarafından dize bölmekBölünmüş '/' kadar '['

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

.

Yani sonuç olarak ben

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

dizeleri de

Ana gibi diğer biçimleri olabilir alacağı/Değer [4za] AX/

Değer [4za] AX/BY BY

Bunu nasıl yapabilirim?

cevap

24

Negatif görünüm ışığını kullanın ((?<!...)). Aşağıdaki regex aracı "/ braket açarak öncesinde değil":

(?<!\[.*)/ 

Demo

C# demo: https://dotnetfiddle.net/85S3cK

+1

: Sonra sadece son öğe üzerine dizesinin bitiş kısmını eklemek dize satır sonları içeriyorsa, ', regex motora ("dotall") seçeneği, bir tekli-geçmesine yararlı olabilir @ "(? s) (?

+0

Ve motor keyfi uzunluktaki görünümleri desteklemiyorsa? –

+0

@QPaysTaxes, rastgele uzunluktaki görünümleri olmadan, tek bir normal ifade, ya TheLethalCoder'in yanıtı gibi bir çözüm üzerinde çaba ve okunabilirlik maliyetine değecek kadar karmaşık ya da çok karmaşık olabilirdi. – asgallant

33

Bunu yapmak için, normal dize işlemlerini kullanabilirsiniz. İlk ['daki dizgiyi bölün, ardından buna göre bölün. Bilginize

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

Eğer "Regex" derlenmezse, bu yöntem aslında daha hızlı olabilirdi. – Pharap

+3

Normal ifade derlenmiş olsa bile, bu muhtemelen daha hızlıdır. – Mardoxx

+0

Bu iyi, ancak tek liner daha da kötü değil ve yeterince okunabilir. –