2010-06-16 34 views
55

Điều này đã được hỏi nhiều lần đối với nhiều ngôn ngữ nhưng tôi không thể làm cho nó hoạt động. Tôi có một chuỗi như thế nàythay thế n và r n bằng <br /> trong java

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

Và tôi đang cố gắng để thay thế các \n với <br /> sử dụng

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

nhưng \n là không nhận được thay thế. Tôi đã cố gắng sử dụng RegEx Tool này để xác minh và tôi thấy kết quả tương tự. Chuỗi đầu vào không có kết quả phù hợp cho "(\r\n|\n)". Tôi đang làm gì sai?

+0

Tôi cũng đã thử '" (\\ r \\ n | \\ n) "' –

+2

Bạn có thể đăng một ví dụ hoàn chỉnh hơn không? Tôi nghĩ rằng lỗi không nằm trong mã bạn đã đăng. –

+1

Tôi khá nhiều có hai dòng giống nhau và tôi đã thử nghiệm nó trong chế độ gỡ lỗi trong nhật thực với một điểm ngắt sau 'replaceAll()'. –

Trả lời

106

Nó phù hợp với tôi.

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

Kết quả:

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

Vấn đề của bạn là ở một nơi khác.

0

Điều đó sẽ hiệu quả, nhưng đừng tự tử khi cố gắng tìm ra. Chỉ cần sử dụng 2 lần.

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

Tuyên bố miễn trừ trách nhiệm: điều này không hiệu quả lắm.

+0

Nếu bạn định thực hiện hai thay thế, thì regex không cần thiết và có thể thực hiện một cách đơn giản: 'str = str.replace (" \ r \ n ","
") .replace (" \ n ","
");' –

+0

@BartK Tôi không nghĩ rằng có một 'thay thế (String, String)' trong chuỗi String. Tôi chỉ có thể tìm thấy 'thay thế (Char, Char)' –

+4

@Bala đúng, không có phương pháp như vậy. Nhưng có một 'thay thế (CharSequence, CharSequence)'. Lưu ý rằng 'Chuỗi' ** là ** một' CharSequence'. –

0

Điều này sẽ hiệu quả. Bạn cần phải đặt trong hai dấu gạch chéo

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

Trong Reference này, có là một ví dụ trong đó cho thấy

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

Tôi đã sử dụng hai dấu gạch chéo trong nhiều dự án của tôi và nó dường như làm việc tốt!

+2

Thực ra bạn không cần hai dấu gạch chéo. –

+4

Cả hai '(\\ r \\ n | \\ n)' và '(\ r \ n | \ n)' sẽ hoạt động. –

+0

không chắc chắn tham chiếu của bạn phải làm gì với phần còn lại của câu trả lời. Phần * "Bạn cần phải đặt vào hai dấu gạch chéo" * thậm chí là sai đồng bằng, phải trung thực. –

19

Một chút phiên bản mạnh mẽ hơn về những gì bạn đang cố gắng:

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

Không cần phải làm phương pháp dài hơn. 'StringAll' replaceAll (...) 'thực hiện chính xác đằng sau hậu trường. Đây là phần thân phương thức của nó: 'return Pattern.compile (expr) .matcher (this) .replaceAll (thay thế)': http://www.docjar.com/html/api/java/lang/String.java.html –

+0

Tốt đẹp! Loại bỏ các mã dự phòng từ câu trả lời của tôi sau đó :) – Dolph

2

Nó làm việc cho tôi. Mã Java hoạt động chính xác như bạn đã viết. Trong trình kiểm tra, chuỗi đầu vào phải là:

This is a string. 
This is a long string. 

... với linefeed thực. Bạn không thể sử dụng:

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

... bởi vì nó xử lý \n là literal chuỗi xuyệc ngược 'n'.

15

Đối với tôi, điều này làm việc:

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

Mẹo: sử dụng regex tester để thử nghiệm nhanh chóng mà không biên dịch trong môi trường của bạn

+10

Tôi không nghĩ rằng bạn có đủ backslashes có :) –

+1

Tôi đã có cùng một vấn đề. Thing là đầu ra đã được hiển thị "\ n" nhưng cho điều này để làm việc, nó là một chuỗi "\\\\" mà kết quả đầu ra là "\ n", do đó giải thích sai :) –

8

Kể từ tài khoản của tôi là mới, tôi không thể up-phiếu trả lời Nino van Hooff của.Nếu dây của bạn đang đến từ một nguồn dựa trên Windows như một máy chủ aspx dựa, giải pháp này không làm việc:

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

Có vẻ là một vấn đề bộ ký tự lạ như đôi back-slashes đang được hiểu là đơn thoát slash nhân vật. Do đó sự cần thiết cho các dấu gạch chéo tăng gấp bốn lần ở trên.

Một lần nữa, trong hầu hết các trường hợp, "(\\r\\n|\\n)" sẽ hoạt động, nhưng nếu chuỗi của bạn đến từ nguồn dựa trên Windows, hãy thử ở trên.

Chỉ cần một FYI đã thử mọi thứ để khắc phục sự cố tôi đã thay thế các kết thúc dòng đó. Suy nghĩ lúc đầu đã bị chuyển đổi không thành công từ Windows-1252 thành UTF-8. Nhưng điều đó cũng không hiệu quả. Giải pháp này là những gì cuối cùng đã làm các trick. :)

Các vấn đề liên quan