2010-04-23 2 views
5

Ich benutze Clojure, also ist dies im Zusammenhang mit Java Regexes. HierEin Regex, um ein Komma zu finden, das nicht von Anführungszeichen umgeben ist

ist ein Beispiel string:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 

Die wichtigen Bits sind die Kommas nach jeder Saite. Ich möchte sie durch die replaceAll-Methode von Java durch Newline-Zeichen ersetzen können. Eine Regex, die entspricht Komma, die nicht von Anführungszeichen umgeben ist, wird tun.

Wenn ich nicht gut komme, bitte fragen Sie und ich werde glücklich sein, alles zu klären.

edit: Entschuldigung für die Verwirrung im Titel. Ich war nicht sehr lange wach.

String: {:a "ab, cd efg",} < - In diesem Beispiel würde das Komma am Ende angepasst werden, aber die, die im Innern des Zitats würde nicht.

Zeichenfolge: {:a 3, :b 3,} < - Jedes einzelne Komma stimmt überein.

Zeichenfolge {:a "abcd,efg" :b "abcedg,e"} < - Jedes einzelne Komma stimmt nicht überein.

+0

können Sie ein Beispiel hinzufügen, in dem jedes einzelne Komma übereinstimmt, und eines, wo jedes einzelne Komma nicht übereinstimmt – mkoryak

Antwort

18

Die Regex:

,\s*(?=([^"]*"[^"]*")*[^"]*$) 

Spiele:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 
       ^    ^
       ^    ^

und:

{:a "ab, cd efg",} 
       ^
       ^

und ein Komma in nicht übereinstimmt:

{:a "abcd,efg" :b "abcedg,e"} 
Aber

wenn entgangen Zitate erscheinen kann, etwa so:

{:a "ab,\" cd efg",} // only the last comma should match 

dann eine Regex-Lösung wird nicht funktionieren.

Eine kurze Erklärung des Regex:

,   # match the character ',' 
\s*   # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(?=   # start positive look ahead 
    (   # start capture group 1 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
)*   # end capture group 1 and repeat it zero or more times 
    [^"]*  # match any character other than '"' and repeat it zero or more times 
    $   # match the end of the input 
)   # end positive look ahead 

Mit anderen Worten: jedes Komma übereinstimmen, die Null oder eine gerade Anzahl von Zitaten vor mir hat (bis zum Ende des Strings).

+0

Sieht aus, als hätten Sie das Gegenteil von dem, was ich wollte. : p Ich möchte die Kommas, die/nicht/in der Zeichenfolge übereinstimmen. :) – Rayne

+0

Ah, da Sie nicht die Anführungszeichen in Ihrer Zeichenfolge entkommen, nahm ich an, dass das erste und letzte Zitat auch ein Teil Ihres Literals waren. Meine Regex ist immer noch korrekt, übrigens. Siehe meine Bearbeitung. –

Verwandte Themen