2017-04-25 2 views
14

ich die folgende Art von Zeichenfolge teilen möchten:Split durch '/' bis '[' erscheint

Eltern-/Kind/Wert [4ZA] AX/BY

und bekommen erstellen String[] aus ihm heraus über:

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

, die die Zeichenfolge geteilt durch jede / vor dem ersten Auftreten von [.

So wie Ergebnis würde ich

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

Strings auch andere Formate haben könnte wie

Eltern-/Wert [4ZA] AX/BY

Wert [4ZA] AX/BY

Wie kann ich das tun?

Antwort

24

Verwenden Sie negative Lookbehind ((?<!...)). Die folgenden regex bedeutet "/ nicht voran durch die Klammer zu öffnen":

(?<!\[.*)/ 

Demo

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

+1

FYI: Wenn die Zeichenfolge Zeilenumbrüche enthält, kann es sinnvoll sein, ein Einleiner zu passieren („dotall“) Option auf die Regex-Engine, '@ "(? s) (?

+0

Und wenn die Engine keine Lookbehinds mit beliebiger Länge unterstützt? –

+0

@QPaysTaxes, ohne Look-Behinds beliebiger Länge, wäre eine einzelne Regex-Anweisung entweder unmöglich oder wahrscheinlich viel zu komplex, um die Kosten in Aufwand und Lesbarkeit gegenüber einer Lösung wie TheLethalCoders Antwort wert zu sein. – asgallant

33

Sie normale String-Operationen verwenden, könnte dies zu tun. Teilen Sie die Zeichenfolge zuerst auf die erste [ und dann teilen Sie das entsprechend. Dann fügen Sie einfach den Endteil der Schnur auf das letzte Element:

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

Wenn der' Regex' nicht kompiliert wird, könnte diese Methode tatsächlich schneller sein. – Pharap

+3

Auch wenn die Regex kompiliert wird, ist dies wahrscheinlich schneller. – Mardoxx

+0

Das ist in Ordnung, aber das Einzeiler ist nicht schlechter und ist lesbar genug. –

Verwandte Themen