2010-06-16 23 views
55

Esto se ha pedido varias veces para varios idiomas pero no puedo hacerlo funcionar. Tengo una cadena como estareemplazar n y r n con <br /> en java

String str = "This is a string.\nThis is a long string."; 

Y yo estoy tratando de reemplazar el \n con <br /> usando

str = str.replaceAll("(\r\n|\n)", "<br />"); 

pero el \n no está recibiendo reemplazado. Intenté usar este RegEx Tool para verificar y veo el mismo resultado. La cadena de entrada no tiene una coincidencia para "(\r\n|\n)". Qué estoy haciendo mal ?

+0

También probé '" (\\ r \\ n | \\ n) "' –

+2

¿Podría publicar un ejemplo más completo? Creo que el error no está en el código que publicaste. –

+1

Casi tengo las mismas dos líneas y lo estaba probando en modo de depuración en eclipse con un punto de interrupción después de 'replaceAll()'. –

Respuesta

106

Funciona para mí.

public class Program 
{ 
    public static void main(String[] args) { 
     String str = "This is a string.\nThis is a long string."; 
     str = str.replaceAll("(\r\n|\n)", "<br />"); 
     System.out.println(str); 
    } 
} 

Resultado:

 
This is a string.<br />This is a long string. 

Su problema está en otra parte.

0

Eso debería funcionar, pero no te mates tratando de descubrirlo. Solo usa 2 pases.

str = str.replaceAll("(\r\n)", "<br />"); 
str = str.replaceAll("(\n)", "<br />"); 

Descargo de responsabilidad: esto no es muy eficiente.

+0

Si va a hacer dos reemplazos, entonces no se necesita regex y uno simplemente puede hacer: 'str = str.replace (" \ r \ n ","
") .replace (" \ n ","
");' –

+0

@BartK No creo que haya un 'replace (String, String)' en la clase String. Solo pude encontrar 'replace (Char, Char)' –

+4

@Bala correcto, no hay tal método. Pero hay un 'replace (CharSequence, CharSequence)'. Tenga en cuenta que 'String' ** es ** a' CharSequence'. –

0

Esto debería funcionar. Es necesario poner en dos barras

str = str.replaceAll("(\\r\\n|\\n)", "<br />"); 

En este Reference, hay un ejemplo que muestra

private final String REGEX = "\\d"; // a single digit 

he utilizado dos barras en muchas de mis proyectos y parece que funciona bien!

+2

En realidad, no necesitas dos barras. –

+4

Ambos '(\\ r \\ n | \\ n)' y '(\ r \ n | \ n)' funcionarán. –

+0

no estoy seguro de lo que su referencia tiene que ver con el resto de su respuesta. La parte * "Tienes que poner dos barras" * es completamente incorrecta, para ser honesto. –

19

Una pequeña versión más robusta de lo que usted está tratando:

str = str.replaceAll("(\r\n|\n\r|\r|\n)", "<br />"); 
+4

No hay necesidad de hacer el método más largo. 'String's' replaceAll (...) 'hace exactamente eso detrás de escena. Este es el cuerpo de su método: 'return Pattern.compile (expr) .matcher (this) .replaceAll (substitute)': http://www.docjar.com/html/api/java/lang/String.java.html –

+0

¡Bonito! Eliminado el código redundante de mi respuesta, entonces :) – Dolph

2

funciona para mí. El código de Java funciona exactamente como lo escribiste. En el probador, la cadena de entrada debe ser:

This is a string. 
This is a long string. 

... con un salto de línea real. No se puede utilizar:

This is a string.\nThis is a long string. 

... porque trata \n como el literal secuencia barra invertida 'n'.

15

Para mí, esto funcionó:

rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "\\\n"); 

Consejo: usar regex tester para la prueba rápida sin compilar en su entorno

+10

No creo que haya suficientes barras invertidas allí :) –

+1

Tuve el mismo problema. La cosa era que la salida mostraba "\ n", pero para que esto funcionara, era una cadena de "\\\\ n" que daba como resultado "\ n", de ahí la interpretación incorrecta :) –

8

Ya que mi cuenta es nueva, no puedo arriba-voto respuesta de Nino van Hooff.Si las cuerdas son procedentes de una fuente basada en Windows, como un servidor basado en aspx, esta solución funciona:

rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "<br />"); 

parece ser un problema de juego de caracteres raro como los dobles copias de barras están siendo interpretados como único escape de barra diagonal caracteres. De ahí la necesidad de las barras cuádruples arriba.

De nuevo, en la mayoría de las circunstancias "(\\r\\n|\\n)" debería funcionar, pero si sus cadenas provienen de una fuente basada en Windows intente lo anterior.

Solo un FYI intenté todo para corregir el problema que tenía al reemplazar esas terminaciones de línea. Al principio se pensó que la conversión había fallado de Windows-1252 a UTF-8. Pero eso tampoco funcionó. Esta solución es lo que finalmente funcionó. :)