2016-03-14 8 views
6

Ich möchte jede Instanz von Text in einer durch Kommas getrennten Liste abgleichen. Dazu wird der folgende reguläre Ausdruck funktioniert super:Übereinstimmende Elemente in einer durch Kommas getrennten Liste, die nicht von einfachen oder doppelten Anführungszeichen umgeben sind

/[^,]+/g 

(Regex101 demo).

Das Problem ist, dass ich alle Kommas ignorieren möchte, die in einfachen oder doppelten Anführungszeichen enthalten sind, und ich bin nicht sicher, wie der obige Selektor erweitert werden kann, um mir das zu ermöglichen.

Hier ist ein Beispiel string:

abcd, efgh, ij"k,l", mnop, 'q,rs't 

ich entweder die fünf Textteile fehlen bin passen oder Spiel der vier relevanten Kommas (so kann ich die Daten retreive mit split() statt match()):

  1. abcd
  2. efgh
  3. ij"k,l"
  4. mnop
  5. 'q,rs't

Oder:

abcd, efgh, ij"k,l", mnop, 'q,rs't 
    ^ ^ ^ ^

Wie kann ich das tun?


drei relevante Fragen existieren, aber keiner von ihnen bieten für sowohl ' und " in JavaScript:

  1. Regex for splitting a string using space when not surrounded by single or double quotes - Java-Lösung scheint nicht in JavaScript.
  2. A regex to match a comma that isn't surrounded by quotes - passt nur auf "
  3. Alternative to regex: match all instances not inside quotes - passt nur auf "
+0

@ WiktorStribiżew, das fehlschlägt, wenn ein Raum in Anführungszeichen ein Komma nächsten ist (https://regex101.com/r/cW5hM0/2). –

+0

@ WiktorStribiżew, dass man alles außerhalb von Anführungszeichen als eine andere Übereinstimmung betrachtet, unabhängig von einem Komma: https://regex101.com/r/cW5hM0/4 (beachten Sie das 'k' Zeichen darin). –

+0

([^,] + ". *" [^,]) + | ([^,]? '. *' [^,]) + | ([^,] +)/G, das sollte funktionieren und erfassen die Gruppen, die Sie möchten – SamyQc

Antwort

3

okay, so können Sie Ihre passenden Gruppen enthalten:

  • Nur Buchstaben
  • Ein passendes Paar von "
  • Ein passendes Paar von '

dies sollte also funktionieren:

/((?:[^,"']+|"[^"]*"|'[^']*')+)/g 

RegEx101 Demo

Als netter Bonus, Sie kann zusätzliche einfache Anführungszeichen in doppelte Anführungszeichen setzen und umgekehrt. Allerdings benötigen Sie wahrscheinlich eine Zustandsmaschine zum Hinzufügen von Escape-Anführungszeichen innerhalb von Strings in doppelten Anführungszeichen (zB "aa \" aa ").

Leider passt es auch auf den ursprünglichen Platz - Sie müssen die . trimmt die Spiele

0

die Sie interessieren in JavaScript

(?:(?:[^,"'\n]*(?:(?:"[^"\n]*")|(?:'[^'\n]*'))[^,"'\n]*)+)|[^,\n]+ 

Demo

In Gruppe für mehr lesbar (entfernen?< Name> für Javascript)

(?<has_quotes>(?:[^,"'\n]*(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+)|(?<simple>[^,\n]+) 

Demo

Erläuterung:

(?<double_quotes>"[^"\n]*") Streichhölzer " Jede innen aber nicht "" = (1) (in doppelten Anführungszeichen)
(?<single_quotes>'[^'\n]*') Streichhölzer ' Beliebig, aber nicht '' = (2) (in Apostroph)
(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*')) matches (1) oder (2) = (3)
[^,"'\n]* entspricht einem beliebigen Text aber nicht "', = (w)
(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*) matches (3) (w)
(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+ Matches wiederholen (3) (w) = (3w +)
(?<has_quotes>[^,"'\n]*(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+) Matches (w) (3w +) = (4) (hat Anführungszeichen)
[^,\n]+ Streichhölzer anderer Fall (5) (einfach)
So in Finale haben wir (4) | (5) (hat Zitat oder einfach)

Eingang

abcd,efgh, ijkl 
abcd, efgh, ij"k,l", mnop, 'q,rs't 
'q, rs't 
"'q,rs't, ij"k, l"" 

Ausgang:

MATCH 1 
simple [0-4] `abcd` 
MATCH 2 
simple [5-9] `efgh` 
MATCH 3 
simple [10-15] ` ijkl` 
MATCH 4 
simple [16-20] `abcd` 
MATCH 5 
simple [21-26] ` efgh` 
MATCH 6 
has_quotes [27-35] ` ij"k,l"` 
double_quotes [30-35] `"k,l"` 
MATCH 7 
simple [36-41] ` mnop` 
MATCH 8 
has_quotes [42-50] ` 'q,rs't` 
single_quotes [43-49] `'q,rs'` 
MATCH 9 
has_quotes [51-59] `'q, rs't` 
single_quotes [51-58] `'q, rs'` 
MATCH 10 
has_quotes [60-74] `"'q,rs't, ij"k` 
double_quotes [60-73] `"'q,rs't, ij"` 
MATCH 11 
has_quotes [75-79] ` l""` 
double_quotes [77-79] `""` 
2

ein Doppel Look-Ahead-Verwendung angepasst Komma zu ermitteln ist außerhalb zitiert:

/(?=(([^"]*"){2})*[^"]*$)(?=(([^']*'){2})*[^']*$)\s*,\s*/g 
  • (?=(([^"]*"){2})*[^"]*$) behauptet, dass es gerade Anzahl von doppelten Anführungszeichen vor passendem Komma ist.
  • (?=(([^']*"){2})*[^']*$) macht die gleiche Behauptung für einfaches Zitat.

PS: Dies behandelt nicht Fall von unsymmetrischen, verschachtelten oder maskierten Anführungszeichen.

RegEx Demo

Verwandte Themen