web-dev-qa-db-fra.com

remplacez\n et\r\n par <br /> en java

Cela a été demandé plusieurs fois pour plusieurs langues mais je n'arrive pas à le faire fonctionner ..__ J'ai une chaîne comme celle-ci

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

Et j'essaie de remplacer le \n par <br /> en utilisant

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

mais le \n n'est pas remplacé… .. J'ai essayé d'utiliser cet outil RegEx pour vérifier et je vois le même résultat. La chaîne d'entrée n'a pas de correspondance pour "(\r\n|\n)". Qu'est-ce que je fais mal ?

61
Bala R

Ça marche pour moi.

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);
    }
}

Résultat:

 Ceci est une chaîne. <br /> Ceci est une longue chaîne .

Votre problème est ailleurs.

111
Mark Byers

Une version un peu plus robuste de ce que vous essayez:

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

Pour moi, cela a fonctionné:

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

Astuce: utilisez regex tester pour un test rapide sans compilation dans votre environnement

16
Nino van Hooff

Comme mon compte est nouveau, je ne peux pas voter pour la réponse de Nino van Hooff. Si vos chaînes proviennent d'une source Windows telle qu'un serveur aspx, cette solution fonctionne:

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

Cela semble être un problème de jeu de caractères bizarre car les doubles barres obliques inversées sont interprétées comme des caractères d'échappement à une seule barre oblique. D'où la nécessité des quadruples barres obliques ci-dessus.

Encore une fois, dans la plupart des cas, "(\\r\\n|\\n)" devrait fonctionner, mais si vos chaînes proviennent d'une source Windows, essayez ce qui précède.

Juste un FYI a tout essayé pour corriger le problème que je devais remplacer ces fins de ligne. Je pensais au début que la conversion de Windows-1252 en UTF-8 a échoué. Mais cela n'a pas fonctionné non plus. Cette solution est ce qui a finalement fait le tour. :)

8
user3798668

Ça marche pour moi. Le code Java fonctionne exactement comme vous l'avez écrit. Dans le testeur, la chaîne d'entrée doit être:

This is a string.
This is a long string.

... avec un vrai saut de ligne. Vous ne pouvez pas utiliser:

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

... car il traite \n en tant que séquence littérale barre oblique inverse 'n' .

2
Alan Moore

Cela devrait fonctionner, mais ne vous tuez pas en essayant de le comprendre. Il suffit d'utiliser 2 passes.

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

Avertissement: ce n'est pas très efficace.

0
Byron Whitlock

Cela devrait marcher. Vous devez mettre deux barres obliques

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

Dans cette Référence , il y a un exemple qui montre

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

J'ai utilisé deux slash dans plusieurs de mes projets et cela semble bien fonctionner!

0
Kasturi