2012-03-24 15 views
23

Tengo una cadena y me gustaría simplemente reemplazar todas las líneas nuevas con la cadena " --linebreak-- ".Java Regex - Usar el método replaceAll de String para reemplazar líneas nuevas

¿Sería suficiente con sólo escribir:

string = string.replaceAll("\n", " --linebreak-- "); 

Estoy confundido con la parte de expresiones regulares de la misma. ¿Necesito dos barras para la nueva línea? ¿Es esto lo suficientemente bueno?

+1

funciona tampoco. Vea las respuestas a [esta pregunta] (http://stackoverflow.com/questions/9113328/java-regular-expression-need-to-escape-backslash-in-regex) para obtener una gran explicación. –

Respuesta

32

¡No utilizar regex!. Solo necesita una coincidencia de texto simple para reemplazar "\n".

Uso replace() para reemplazar una cadena literal con otro:

string = string.replace("\n", " --linebreak-- "); 

Tenga en cuenta que todavía replace() reemplaza todas las ocurrencias, al igual que replaceAll() - la diferencia es que replaceAll() utiliza expresiones regulares para buscar.

+2

¿Entonces está diciendo que use replace() dentro de un bucle en lugar de usar replaceAll() una vez? No entiendo por qué esa es una mejor idea? – Tim

+4

@Tim Calling 'replace()' * una vez * reemplaza * todas * las apariciones (no se requiere "loop") – Bohemian

+0

Oh wow. Gracias, por alguna razón lo pasé por alto cuando leí las especificaciones. – Tim

3

No hay necesidad de 2 backslashes.

String string = "hello \n world" ; 
String str = string.replaceAll("\n", " --linebreak-- "); 
System.out.println(str); 

salida = hello --linebreak-- world

29

Uso de expresiones regulares a continuación:

s.replaceAll("\\r?\\n", " --linebreak-- ") 

Sólo hay realmente dos nuevas líneas para UNIX y Windows OS.

1

para la nueva línea no es una propiedad

System.getProperty("line.separator") 

Aquí, como por su ejemplo,

string.replaceAll("\n", System.getProperty("line.separator")); 
2

sólo añadir este está completo, porque la cosa 2 barra invertida es real.

Consulte @dasblinkenlight respuesta en la siguiente pregunta SO (hablando de \ t sino que se aplica para \ n también):

java, regular expression, need to escape backslash in regex

"Hay dos interpretaciones de secuencias de escape pasando: primero por el compilador de Java, y luego por el motor de expresiones regulares. Cuando el compilador de Java ve dos barras diagonales, las reemplaza con una sola barra inclinada. Cuando no hay una barra oblicua, Java lo reemplaza con una pestaña, cuando hay un doble slash, Java lo deja solo. Sin embargo, debido a que dos barras han sido reemplazadas por una barra oblicua, el motor de expresión regular ve \ t, y lo interpreta como una pestaña ".

+0

La otra cosa que está sucediendo es que la primera arg para replaceAll puede ser una cadena plana o una expresión regular. En una Cadena, la "\ n" se interpreta como un literal, pero si incluye otros símbolos regex solo, como corchetes para conjuntos de caracteres, entonces necesita la barra adicional para obtener la secuencia correcta para el compilador de expresiones regulares, como usted dice. ..... por ejemplo, "[\\ r \\ n] +" – Rondo

10

Dado que el motor regex Java 8 admite \R que representa cualquier separador de línea (poco más información: https://stackoverflow.com/a/31060125/1393766).

Así que si usted tiene acceso a Java 8 se puede utilizar

string = string.replaceAll("\\R", " --linebreak-- "); 
Cuestiones relacionadas