2011-01-26 9 views

Respuesta

4

Esto debe hacerlo, usando un Negative Lookahead:

"(?!, -)([^"]*)"(?!, -) 

Un poco desordenada, pero funciona. Desea asegurarse de que su cadena no siga cualquiera de las comillas o, de lo contrario, la coincidencia comenzará en las comillas de cierre.

http://rubular.com/r/yFMyUKJOHL

+1

Esta es la mejor solución hasta el momento: solo fallará si una cadena comienza a ', -' que no es muy probable ... –

+0

@Tim - ohh. Buen punto. Pero entonces el' "([^ "] *)" (?!, -) 'el resultado aparentemente incorrecto podría considerarse válido, ya que introduce ambigüedad. – Kobi

0

Añadir (?!...) al final de la expresión regular:

"([^"\n]*)"(?!, -) 
+1

había pensado en eso, también, pero esto sólo funciona si hay exactamente un par de comillas por línea ... –

+0

También he reemplazado '[^"] 'con' [^ "\ n]' para evitar nuevas líneas en qoutes. Otra forma de evitar esto podría ser algo como '" (\ b [^ "] * \ b)" (?!, -) '. –

1

Regex

"(.*?)"(?!, -)

Ejemplo de trabajo

http://rubular.com/r/9kOmZLxLfy

+0

Esto solo funciona si hay a lo sumo un par de comillas por línea. –

+0

.. .y, no funciona si las comillas pueden abarcar varias líneas. Si estos no son los casos, esta es una buena solución. – Kobi

+0

Acabo de mejorar la expresión regular OP para hacer lo que quería. Todos esos defectos que menciona están presentes en el regex original también –

1

Esto es no se puede analizar en su contexto, su final abierto. La única manera de analizarlo es consumir tanto los no como los deseos, pero sigue siendo una premisa inválida.

/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/

A continuación, comprobar si hay grupo de captura 1 en cada partido, algo como esto:

$rx = qr/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/; 
while (' "ingnore me", - "but not me" ' =~ /$rx/g) { 
    print "'$1'\n" if defined $1 
} 
Cuestiones relacionadas