2010-11-11 25 views
35

Tengo un problema con el replaceAll para una cadena de varias líneas:Java expresiones regulares replaceAll multilínea

String regex = "\\s*/\\*.*\\*/"; 
String testWorks = " /** this should be replaced **/ just text"; 
String testIllegal = " /** this should be replaced \n **/ just text"; 

testWorks.replaceAll(regex, "x"); 
testIllegal.replaceAll(regex, "x"); 

Los trabajos anteriores para TestWorks, pero no para testIllegal !? ¿Por qué es eso y cómo puedo superar esto? Necesito reemplazar algo así como un comentario/* ... */que abarca múltiples líneas.

+0

Y qué pasa con esta cadena: '" String s = \ "/ * \";/* comment */"' –

+0

Bueno, el punto es que la regexación mathing debería coincidir solo al principio de la cadena. Ahora se ve así :(? S)^\\ s */\\ *. * \\ */No estoy seguro, si es reacio (? S)^\\ s */\\ *. *? \\ */ – Robert

Respuesta

59

Es necesario utilizar la bandera Pattern.DOTALL decir que el punto debe coincidir con saltos de línea. p.ej.

Pattern.compile(regex, Pattern.DOTALL).matcher(testIllegal).replaceAll("x") 

o especificar la bandera en el patrón usando (?s) por ejemplo

String regex = "(?s)\\s*/\\*.*\\*/"; 
+1

Esta es la mejor solución porque no interactúa con la cadena de expresiones regulares en sí misma, solo especifica un indicador. No lo sabía, ¡Gracias! – Robert

+1

Si tiene varios comentarios de "varias líneas", este método también eliminará el texto entre esos comentarios. Use el método publicado por Boris en su lugar. – lepe

7

El carácter meta . coincide con cualquier carácter que no sea nueva línea. Es por eso que su expresión regular no funciona para el caso de múltiples líneas.

Para solucionar esto, reemplace . con [\d\D] que coincida con cualquier carácter incluyendo newline.

Code In Action

+1

Intercambiando en '[\ d \ D]' por '.' (que normalmente significa' [^ \ n] ', al menos en el modo' Pattern.UNIX_LINES') me parece inapropiado porque no es obvio qué está haciendo, porque son 6 caracteres por 1, y porque hay otras maneras de hacerlo. – tchrist

8

Añadir Pattern.DOTALL a la compilación, o (?s) al patrón.

Cuestiones relacionadas