2012-01-05 14 views
6

Gracias por mirar,Regex: Exigir que las cotizaciones se escaparon en una cadena

que he tenido un tiempo terrible tratando de obtener el derecho de términos de búsqueda para esta pregunta expresiones regulares. Necesito asegurarme de que las comillas ya se hayan escapado en una cadena; de lo contrario, la coincidencia debería fallar. (La mayoría de los resultados de búsqueda para este tipo de preguntas son sólo las páginas que dicen que necesita para escapar de las cotizaciones o cómo escapar comillas.)

Válido:

This is valid 
This \"is Valid 
This is al\"so Valid\" 

no válido:

This i"s invalid 
This i"s inv"alid 

Lo único He logrado encontrar hasta ahora es

((?:\\"|[^"])*) 

Esto parece coincidir con la primera parte de la siguiente debido, pero nada después de la cita escapado

This is a \"test 

Una vez más, esto debe fallar:

This is a \"test of " the emergency broadcast system 

Gracias por cualquier ayuda, espero que esto es posible.

+1

Qué idioma se utiliza? –

+0

+1, problema interesante para el cual RE realmente parece ser la herramienta adecuada. –

+0

@JosephSilber En realidad, no estoy usando un idioma, esta expresión regular irá dentro de un campo de expresiones regulares utilizado en un CMS que requiere la entrada del usuario para que coincida :) – Bung

Respuesta

6

En C#, esto parece funcionar como se desea:

string pattern = "^([^\"\\\\]*(\\\\.)?)*$"; 

Excluyendo el escape le deja con:

^([^"\\]*(\\.)?)*$ 

que se traduce aproximadamente en: inicio-de-cadena, (multi-chars-exclu ding-quote-or-backslash, opcional-backslash-anychar) -repeated, end-of-string

Es el comienzo de la cadena y el final de la cadena de marcadores que obliga a la coincidencia sobre el texto completo.

+0

esto me ha funcionado bien, excepto en un caso: Esto es \ "válido \ Creo que es bastante improbable que yo ' Recibirá entrada con una barra al final y puede dejar que falle. – Bung

+2

Sí, está diseñado para fallar en el caso de una sola barra invertida al final. La razón es que si la cadena admite caracteres escapados usando barra diagonal inversa, una sola barra invertida nunca puede ser válida. – adelphus

+0

ah eso tiene perfecto sentido, gracias – Bung

1

Necesita tomar todo excepto una barra diagonal inversa y una comilla, o una barra diagonal inversa y el siguiente caracter.

([^\\"]|\\.)* 

De esta manera, se producirá un error:

ab\\"c 

Esto tendrá éxito:

ab\\\"c 

Esto tendrá éxito:

ab\"c 
2

No sabe el idioma que uso, pero lo hubiera hecho de esta manera:

hacer una expresión regular, que coincide con un presupuesto sin una barra invertida, que se producirá un error en

This is a \"test 

y tuvo éxito en

This is a \"test of " the emergency broadcast system 

por ejemplo ésta:

.*(?<!\\)".* 

y luego usará expresión negativa con el resultado. Esperamos que esto ayudará a

mi prueba en Java parece

String pat = ".*(?<!\\\\)\".*"; 
    String s = "This is a \\\"test"; 
    System.out.println(!s.matches(pat)); 
    s = "This is a \\\"test of \" the emergency broadcast system"; 
    System.out.println(!s.matches(pat)); 
2

Desea utilizar un aspecto negativo detrás.

(?<!\\)" 

Esta expresión regular coincidirá con todas las comillas que no están precedidas por una barra oblicua.

Si ejecuta esta expresión regular en su cadena de muestra y encuentra 1 o más coincidencias, entonces la cadena no es válida.

1

RegEx que estás buscando es:

/^(?:[^"]*(?:(?<=\\\)"|))*$/ 

Explicación:[^"]* coincidirá con la entrada hasta la primera " se encuentra o se alcance final de la entrada. Si se encuentra ", asegúrese de que en (?<=\\\)" mire detrás que es siempre precedido por /. El escenario anterior es recursivo repetido hasta que se llega al final de la entrada.

PRUEBA: Considere siguiente código PHP para probar:

$arr=array('This is valid', 
'This \"is Valid', 
'This is al\"so Valid\"', 
'This i"s invalid', 
'This i"s inv"alid', 
'This is a \"test', 
'This is a \"test of " the emergency broadcast system - invalid'); 
foreach ($arr as $a) { 
    echo "$a => "; 
    if (preg_match('/^(?:[^"]*(?:(?<=\\\)"|))*$/', $a, $m)) 
     echo "matched [$m[0]]\n"; 
    else 
     echo "didn't match\n"; 
} 

SALIDA:

This is valid => matched [This is valid] 
This \"is Valid => matched [This \"is Valid] 
This is al\"so Valid\" => matched [This is al\"so Valid\"] 
This i"s invalid => didn't match 
This i"s inv"alid => didn't match 
This is a \"test => matched [This is a \"test] 
This is a \"test of " the emergency broadcast system - invalid => didn't match 
+0

Vea este código ejecutándose en: http://ideone.com/gUyPe – anubhava

Cuestiones relacionadas