2010-04-23 33 views
5

Estoy usando Clojure, por lo que esto está en el contexto de las expresiones regulares de Java.Una expresión regular para hacer coincidir una coma que no está rodeada por comillas

Aquí es una cadena de ejemplo:

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

Los bits importantes son las comas después de cada cadena. Me gustaría poder reemplazarlos con caracteres de nueva línea con el método replaceAll de Java. Una expresión regular que coincida con cualquier coma que no esté rodeada por comillas lo hará.

Si no me encuentro bien, por favor pregunte y estaré encantado de aclarar cualquier cosa.

editar: disculpa la confusión en el título. No he estado despierto por mucho tiempo.

Cadena: {:a "ab, cd efg",} < - En este ejemplo, el coma al final podría verse igualado, pero los que dentro de la cita no lo haría.

Cadena: {:a 3, :b 3,} < - Cada coma individual coincide.

Cadena {:a "abcd,efg" :b "abcedg,e"} < - Cada coma no coincide.

+0

puede agregar un ejemplo donde coincidan todas las comas, y una donde cada coma no coincide con – mkoryak

Respuesta

18

la expresión regular:

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

Partidos:

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

y:

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

y no coincide con una coma en:

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

Pero cuando comillas escapadas pueden aparecer, así:

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

continuación, una solución de expresiones regulares no va a funcionar.

Una breve explicación de la expresión regular:

,   # 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 

En otras palabras: igualar cualquier coma que tiene cero o un número par de citas por delante de él (hasta el final de la cadena).

+0

Parece que hizo lo contrario de lo que yo quería. : p Quiero hacer coincidir las comas que/are not/in the string. :) – Rayne

+0

Ah, ya que no escapó de las comillas dentro de su cadena, asumí que la primera y última cita también eran parte de su literal. Mi expresión regular sigue siendo correcta, por cierto. Ver mi edición –

Cuestiones relacionadas