2010-06-16 6 views
55

Cela a été demandé à plusieurs reprises pour plusieurs langues, mais je ne peux pas le faire fonctionner. J'ai une chaîne comme ceremplacer n et r n avec <br /> en java

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

Et je suis en train de remplacer le \n avec <br /> en utilisant

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

mais le \n ne reçoit pas remplacé. J'ai essayé d'utiliser ce RegEx Tool 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 ?

+0

J'ai également essayé '" (\\ r \\ n | \\ n) "' –

+2

Pourriez-vous poster un exemple plus complet? Je pense que l'erreur n'est pas dans le code que vous avez posté. –

+1

J'ai à peu près les deux mêmes lignes et je l'ai testé en mode debug en éclipse avec un point de rupture après 'replaceAll()'. –

Répondre

106

Il fonctionne 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:

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

Votre problème est ailleurs.

0

Cela devrait fonctionner, mais ne vous tuez pas essayer de le comprendre. Utilisez simplement 2 passes.

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

Clause de non-responsabilité: ce n'est pas très efficace.

+0

Si vous allez faire deux remplacements, alors regex n'est pas nécessaire et on pourrait simplement faire: 'str = str.replace (" \ r \ n ","
") .replace (" \ n ","
");' –

+0

@BartK Je ne pense pas qu'il existe un 'replace (String, String)' dans la classe String. J'ai seulement pu trouver 'remplacer (Char, Char)' –

+4

@Bala correct, il n'y a pas une telle méthode. Mais il y a un 'replace (CharSequence, CharSequence)'. Notez que 'String' ** est ** un' CharSequence'. –

0

Cela devrait fonctionner. Vous avez besoin de mettre en deux barres obliques

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

Dans ce Reference, il y a un exemple qui montre

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

Je l'ai utilisé deux barres obliques dans plusieurs de mes projets et il semble fonctionner très bien!

+2

En fait, vous n'avez pas besoin de deux barres obliques. –

+4

Tant '(\\ r \\ n | \\ n)' et '(\ r \ n | \ n)' fonctionneront. –

+0

ne sais pas ce que votre référence a à voir avec le reste de votre réponse. La partie * "Vous devez mettre deux barres obliques" * est carrément fausse, pour être honnête. –

19

Une petite version plus robuste de ce que vous essayez:

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

Il n'est pas nécessaire de faire la méthode la plus longue. 'String'' replaceAll (...) 'fait exactement ça en coulisses. Voici son corps de méthode: 'return Pattern.compile (expr) .matcher (this) .réplaceAll (substitut)': http://www.docjar.com/html/api/java/lang/String.java.html –

+0

Agréable! Retiré le code redondant de ma réponse alors :) – Dolph

2

Il fonctionne 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 saut de ligne réel. Vous ne pouvez pas utiliser:

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

... car il traite \n que la séquence littérale anti-slash 'n'.

15

Pour moi, cela a fonctionné:

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

Astuce: utiliser regex tester pour le test rapide sans compilation dans votre environnement

+10

Je ne pense pas que vous avez assez antislashs là :) –

+1

J'ai eu le même problème. Chose était la sortie a montré "\ n" mais pour que cela fonctionne, c'était une chaîne de "\\\\ n" dont la sortie résultait comme "\ n", d'où la mauvaise interprétation :) –

8

Depuis mon compte est nouveau je ne peux pas-voix réponse de Nino van Hoof.Si vos cordes proviennent d'une source basé sur Windows comme un serveur basé ASPX, cette solution fonctionne:

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

semble être un problème de jeu de caractères bizarre que les deux doubles barres obliques sont interprétées comme une fuite de barre oblique personnages. D'où la nécessité des quadrillations ci-dessus.

Encore une fois, dans la plupart des circonstances "(\\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 j'avais en train de remplacer ces fins de ligne. Pensée au début a échoué conversion de Windows-1252 à UTF-8. Mais cela ne fonctionnait pas non plus. Cette solution est ce qui a finalement fait l'affaire. :)

Questions connexes