2017-04-25 9 views
14

Chcę podzielić następujący rodzaj wyrażenie:Podział przez '/' do '[' pojawia

Rodzic/Dziecko/Value [4ZA] AX/BY

i dostać Utwórz A String[] z niego poprzez:

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

które podzielić ciąg przez każdego / przed pierwszym pojawieniem [.

Więc jako rezultat chciałbym uzyskać

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

struny mogły mieć również inne formaty jak

Rodzic/Value [4ZA] AX/BY

Wartość [4ZA] AX/BY

Jak mogę to zrobić?

Odpowiedz

24

Użyj negatywnego lookbehind ((?<!...)). Następujące regex oznacza "/ nie poprzedzone otwarciem wspornik":

(?<!\[.*)/ 

Demo

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

+1

FYI: Jeśli ciąg zawiera podziały wierszy, może to być przydatne zdać SingleLine („dotall”) opcję do silnika regex, '@ "(? s) (?

+0

A jeśli silnik nie obsługuje arbitrów o dowolnej długości? –

+0

@QPaysTaxes, bez arbitralnych długości lookbehinds, pojedyncza instrukcja regex byłaby albo niemożliwa albo prawdopodobnie zbyt skomplikowana, by była warta kosztu wysiłku i czytelności nad rozwiązaniem takim jak odpowiedź TheLethalCoder. – asgallant

33

Można używać normalnego funkcjonowania ciągów to zrobić. Po prostu podziel ciąg na pierwszy [, a następnie podziel go odpowiednio. Następnie wystarczy dodać udział końca łańcucha na ostatnim elemencie:

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

Jeśli' Regex' nie zostanie skompilowany, to ta metoda może być w rzeczywistości szybsza. – Pharap

+3

Nawet jeśli regex jest skompilowany, prawdopodobnie jest to szybsze. – Mardoxx

+0

To dobrze, ale jednolinijka nie jest gorsza i jest wystarczająco czytelna. –