2010-04-23 10 views
5

Sto usando Clojure, quindi questo è nel contesto delle espressioni regolari di Java.Un regex per corrispondere a una virgola che non è circondata da virgolette

Qui corda è un esempio:

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

I bit importanti sono le virgole dopo ogni stringa. Mi piacerebbe essere in grado di sostituirli con caratteri di nuova riga con il metodo replaceAll di Java. Una regex che corrisponderà a qualsiasi virgola che non è circondata da virgolette farà.

Se non mi trovo bene, per favore chiedi e sarò felice di chiarire qualsiasi cosa.

modifica: scusa per la confusione nel titolo. Non sono stato sveglio molto a lungo.

String: {:a "ab, cd efg",} < - In questo esempio, la virgola alla fine potrebbe essere eguagliato, ma quelli all'interno della citazione non sarebbe.

Stringa: {:a 3, :b 3,} < - Ogni singola virgola corrisponde.

Stringa {:a "abcd,efg" :b "abcedg,e"} < - Ogni singola virgola non corrisponde.

+0

puoi aggiungere un esempio in cui ogni singola virgola corrisponde e una dove ogni singola virgola non corrisponde a – mkoryak

risposta

18

la regex:

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

Partite:

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

e:

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

e non corrisponde una virgola:

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

Ma quando citazioni sfuggiti possono apparire, in questo modo:

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

quindi una soluzione regex non funzionerà.

Una breve spiegazione della 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 

In altre parole: adattarsi a qualsiasi virgola che ha zero o un numero di citazioni davanti a sé (fino alla fine della stringa).

+0

Sembra che tu abbia fatto il contrario di quello che volevo. : p Voglio abbinare le virgole che/non sono/nella stringa. :) – Rayne

+0

Ah, dal momento che non hai sfuggito alle virgolette nella tua stringa, ho pensato che anche la prima e l'ultima citazione fossero parte del tuo letterale. Il mio regex è ancora corretto, btw. Vedi la mia modifica. –

Problemi correlati