2009-04-08 15 views
11

EDIT: Kann mir jemand helfen, für eine Zeichenfolge mit einem regulären Ausdruck aus wie diese ?:Wie wird die Zeichenkette durch ',' getrennt, es sei denn, ',' ist in Klammern mit Regex?

[Header 1], [Head,er 2], Header 3

so, dass ich das in Stücke wie aufspalten:

[Header 1]
[Head,er 2]
Header 3

Ich bin soweit gekommen:

(?<=,|^).*?(?=,|$) 

Was mich geben wird:

[Header 1]
[Head
,er 2]
Header 3

+0

Wie CSV-Implementierungen von Menschen braucht die Welt ??? –

+0

Ist das eine Hausaufgabenfrage?Weil ich es einfacher finde, einfache alte Manipulation zu verwenden - im Grunde: für jedes char: Wenn char ein Komma ist und nicht innerhalb einer Klammer, dann füge aktuellen String zu Liste hinzu –

Antwort

15

In diesem Fall ist es einfacher, die Trennzeichen (Kommas) aufzuteilen als die Token (oder Chunks). Die Identifizierung der Kommas, die Trennzeichen sind dauert einen relativ einfachen Look-Ahead:

,(?=[^\]]*(?:\[|$)) 

Jedes Mal, wenn Sie ein Komma finden, Sie tun, um einen Look-Ahead für einen von drei Dingen. Wenn Sie zuerst eine schließende eckige Klammer finden, befindet sich das Komma innerhalb eines Klammerpaars. Es ist also kein Trennzeichen. Wenn Sie eine öffnende Klammer oder das Ende der Zeile/des Strings finden, handelt es sich um ein Trennzeichen.

+0

Ah ich Sehen Sie, ich kann die Kommas durch ein anderes spezielles Zeichen ersetzen und genau damit teilen. Das wird für mich funktionieren! Vielen Dank! – Nate

+0

Dies funktioniert perfekt, solange keine verschachtelten Klammern vorhanden sind. Zum Beispiel funktioniert wie erwartet für '[a], [b], [c [d, e]]', aber scheitert in '[a], [b], [c, [d, e]] '. Entspricht dem Komma neben c im letzten Beispiel. Wie kann das verbessert werden, damit es auch nicht dazu passt? – matte

+0

Um genauer zu sein für '[a], [b, []' stimmt es mit dem Komma nach b überein. Wenn es eine öffnende eckige Klammer in '[]' gibt, stimmt dieses Muster mit dem Komma in den Klammern überein. – matte

1

Ist das nicht so einfach?

(?<=,|^)(?:[^,]|\[[^[]*\])* 
+0

Wenn ich Ihre Regex verwende, bekomme ich die folgende Form der Dev Tools: 'regex =/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) */ SyntaxError: Ungültiger regulärer Ausdruck:/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) * /: Ungültige Gruppe' – starbeamrainbowlabs

2
(?<=,|^)\s*\[[^]]*\]\s*(?=,|$) 

verwenden, um die [ und ] Begrenzungszeichen zu Ihrem Vorteil

6
\[.*?\] 

die Kommas vergessen, Sie über sie nicht. :)

+0

Gute Antwort, aber er hat die Frage an dich geändert ... – dmckee

+0

Nun, jetzt bin ich verwirrt. Sagt es wirklich Header oder ist das ein Platzhalter? Sind die Klammern wirklich da oder optional? Es ist jetzt verwirrend, was genau die gültigen Eingabezeichenfolgen sind. –

+0

Sorry über die Änderung, Gültige Eingabe Strings sind [Einige Text], Einige mehr Text, [Noch Mo, Re Text] ... aufgeteilt in [Einige Text]/Einige mehr Text/[Noch Mo, Re Text] – Nate

1

Sie könnte entweder einen regulären Ausdruck verwenden, um die Werte in den Klammern entsprechen:

\[[^\]*]\] 

Oder Sie verwenden diese regulären Ausdruck der Halterung Liste (mit Umsehen Behauptungen) aufzuspalten:

(?<=]|^)\s*,\s*(?=\[|$) 
Verwandte Themen