2012-08-02 12 views
17

Cómo escribir una expresión regular para que coincida con esta \" (una barra invertida luego una comilla)? Supongamos que tengo una cadena como esta:Java: expresión regular para hacer coincidir una barra invertida seguida de una comilla

<a href=\"google.com\"> click to search </a> 

tengo que sustituir todo el \" con un ", por lo que el resultado será similar:

<a href="google.com"> click to search </a> 

Ésta no funciona: str.replaceAll("\\\"", "\"") porque solo coincide con la cita. No estoy seguro de cómo moverse con la barra invertida. Podría haber eliminado la barra invertida primero, pero hay otras barras invertidas en mi cadena.

+0

Necesita más barras diagonales inversas en el primer parámetro. Puede parecer un poco contra-intuitivo, pero si lo piensas, tendrá sentido. –

+2

Para escribir un literal \ en la expresión regular, use '" \\\\ "' La primera "duplicación" es para escapar de la barra en la cadena * literal * (por lo que la cadena resultante * valor * es \\\). Luego, la primera barra escapa del segundo * en * el motor de expresiones regulares, por lo que coincidirá con un \ carácter. Diversión, ¿eh? –

+1

Parece que intenta decodificar una cadena que puede contener secuencias de escape, donde la barra invertida es el carácter de escape. ¿Cuál debería ser la salida de su decodificador cuando la entrada contiene una barra invertida-barra invertida? Asegúrese de escribir una prueba para ese caso. – dnault

Respuesta

47

literales Si va a sustituir y no necesitan la sintaxis de expresiones regulares en lugar de replaceAll uso replace

str = str.replace("\\\","\""); 

Ambos métodos reemplazarán todas las ocurrencias de los objetivos, pero replace tratarán a los objetivos de la letra.


pero si realmente imprescindible el uso de expresiones regulares que busca

str = str.replaceAll("\\\\\"", "\"") 

\ es carácter especial en expresiones regulares (utilizado por ejemplo para crear \d - clase de caracteres que representa dígitos). Para hacer que la expresión regular trate \ como carácter normal, debe colocar otra \ antes para desactivar su significado especial (debe escaparse). Entonces, la expresión regular que estamos tratando de crear es \\.

Pero para crear cadena que representa \\ por lo que podría pasar al motor de expresiones regulares que necesita para escribir como cuatro \ ("\\\\"), porque \ es también carácter especial en cadena (que puede ser utilizado por ejemplo como \t para representar un tabulador) por lo que también debe escapar ambos \ allí.

En otras palabras, tiene que escapar \ dos veces:

  • una vez en expresiones regulares \\
  • y una vez en Cadena "\\\\"
+0

Oh mi ... Entendido. Aunque un poco gracioso. Gracias una tonelada. – Simo

6

No es necesario una expresión regular.

str.replace("\\\"", "\"") 

debería funcionar bien.

El método replace toma dos subcadenas y reemplaza todas las apariciones no superpuestas de la primera con la segunda.Por la javadoc:

public String replace(CharSequence target, 
         CharSequence replacement) 

reemplaza cada subcadena de esta cadena que coincide con la secuencia diana literal con la secuencia de sustitución literal especificado. El reemplazo procede desde el comienzo de la cadena hasta el final, por ejemplo, reemplazando "aa" con "b" en la cadena "aaa" dará como resultado "ba" en lugar de "ab".

0

probar esto: str.replaceAll("\\\\\"", "\\\"")
porque Java reemplazará \ dos veces:

(1) \\\\\" ->\\" (por cadena)
(2) \\" ->\" (por expresiones regulares)

Cuestiones relacionadas