2010-06-16 8 views
55

To pytanie zostało kilkakrotnie zapytane o kilka języków, ale nie mogę go uruchomić. mam ciąg jak tozamień n i r n na <br /> w java

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

I próbuję zastąpić \n z <br /> użyciu

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

ale \n nie jest uzyskiwanie wymienić. Próbowałem użyć tego RegEx Tool, aby zweryfikować i widzę ten sam wynik. Ciąg wejściowy nie pasuje do "(\r\n|\n)". Co ja robię źle ?

+0

Próbowałem także '" (\\ r \\ n | \\ n) "' –

+2

Czy możesz wysłać bardziej kompletny przykład? Myślę, że błąd nie znajduje się w opublikowanym przez Ciebie kodzie. –

+1

Mam prawie te same dwie linie i testowałem je w trybie debugowania w czasie zaćmienia z punktem przerwania po 'replaceAll()'. –

Odpowiedz

106

To działa dla mnie.

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

Wynik:

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

Twój problem jest gdzieś indziej.

0

To powinno zadziałać, ale nie zabijaj się, próbując to rozgryźć. Po prostu użyj 2 karnetów.

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

Nota prawna: nie jest to bardzo skuteczne.

+0

Jeśli zamierzasz dokonać dwóch zamienników, to wyrażenie regularne nie jest potrzebne i można po prostu zrobić: 'str = str.replace (" \ r \ n ","
") .replace (" \ n ","
");' –

+0

@BartK Nie sądzę, że istnieje 'replace (String, String)' w klasie String. Udało mi się tylko znaleźć 'replace (Char, Char)' –

+4

@Bala, nie ma takiej metody. Ale jest 'replace (CharSequence, CharSequence)'. Zwróć uwagę, że 'String' ** to ** a' CharSequence'. –

0

To powinno zadziałać. Należy umieścić w dwóch ukośników

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

W tym Reference, nie jest przykładem, który pokazuje

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

użyłem dwa ukośniki w wielu moich projektów i wydaje się działać prawidłowo!

+2

W rzeczywistości nie potrzebujesz dwóch ukośników. –

+4

Zarówno '(\\ r \\ n | \\ n)' i '(\ r \ n | \ n)' będą działać. –

+0

nie wiesz, co Twój odnośnik ma do reszty odpowiedzi. Część * "Musisz umieścić dwa ukośniki" * jest nawet całkowicie błędny, szczerze mówiąc. –

19

Nieco bardziej wytrzymała wersja tego, co próbujesz:

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

Nie ma potrzeby wykonywania dłuższej metody. 'String's' replaceAll (...) 'robi dokładnie to za kulisami. Oto jego treść: 'return Pattern.compile (expr) .matcher (this) .replaceAll (substitute)': http://www.docjar.com/html/api/java/lang/String.java.html –

+0

Miły! Usunięto zbędny kod z mojej odpowiedzi wtedy :) – Dolph

2

To działa na mnie. Kod Java działa dokładnie tak, jak go napisałeś. W testerze ciąg wejściowy powinien być:

This is a string. 
This is a long string. 

... z rzeczywistym podajnikiem liniowym. Nie można używać:

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

... ponieważ traktuje \n jako dosłownym sekwencja backslash 'n'.

15

Dla mnie to działało:

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

Wskazówka: użyj regex tester do szybkiego testowania bez kompilacji w środowisku

+10

Nie sądzę, że masz wystarczająco dużo backslashes :) –

+1

Miałem ten sam problem. Rzecz była wynikiem "\ n", ale żeby to działało, był to ciąg "\\\\ n", z którego wynik wynikał "\ n", stąd błędna interpretacja :) –

8

Ponieważ moje konto jest nowy nie mogę się-głosowania odpowiedź Nino van Hooff użytkownika.Jeśli struny pochodzą ze źródła na bazie systemu Windows, takich jak serwer aspx opiera, to rozwiązanie działa:

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

Wydaje się być dziwny zestaw znaków problem jak podwójne back-ukośniki są interpretowane jako pojedynczy ukośnik ucieczki postacie. Stąd potrzeba czterokrotnych ciosów powyżej.

Ponownie, w większości przypadków powinien działać "(\\r\\n|\\n)", ale jeśli twoje struny pochodzą ze źródła Windows, wypróbuj powyższe.

Po prostu FYI próbowałem wszystkiego, aby rozwiązać problem, który zastępuję te zakończenia linii. Początkowo myśl nie powiodła się z konwersji z Windows-1252 na UTF-8. Ale to też nie zadziałało. To rozwiązanie ostatecznie rozwiązało problem. :)

Powiązane problemy