2012-03-24 31 views
23

Tôi có một chuỗi và chỉ muốn thay thế tất cả các dòng mới trong đó bằng chuỗi " --linebreak-- ".Java Regex - Sử dụng chuỗi thay thếTất cả phương pháp để thay thế dòng mới

Nó sẽ là đủ để chỉ cần viết:

string = string.replaceAll("\n", " --linebreak-- "); 

Tôi đang bối rối với phần regex của nó. Tôi có cần hai dấu gạch chéo cho dòng mới không? Điều này có đủ tốt không?

+1

Hoặc hoạt động. Xem câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/9113328/java-regular-expression-need-to-escape-backslash-in-regex) để có giải thích tuyệt vời. –

Trả lời

32

Không sử dụng regex!. Bạn chỉ cần một kết hợp văn bản thuần túy để thay thế "\n".

Sử dụng replace() để thay thế một chuỗi chữ với nhau:

string = string.replace("\n", " --linebreak-- "); 

Lưu ý rằng replace() vẫn thay thế tất cả lần xuất hiện, cũng như replaceAll() - sự khác biệt là replaceAll() sử dụng regex để tìm kiếm.

+2

Vì vậy, bạn đang nói để sử dụng thay thế() bên trong một vòng lặp thay vì sử dụng replaceAll() một lần? Tôi không hiểu tại sao đó là một ý tưởng tốt hơn? – Tim

+4

@Tim Gọi 'thay thế()' * một lần * thay thế * tất cả * lần xuất hiện (không yêu cầu "vòng lặp") – Bohemian

+0

Ồ wow. Cảm ơn bạn, vì một lý do nào đó tôi đã bỏ qua điều đó khi đọc spec. – Tim

3

Không cần 2 backslashes.

String string = "hello \n world" ; 
String str = string.replaceAll("\n", " --linebreak-- "); 
System.out.println(str); 

Output = hello --linebreak-- world

29

Sử dụng dưới đây regex:

s.replaceAll("\\r?\\n", " --linebreak-- ") 

Chỉ có thực sự hai dòng mới cho UNIX và hệ điều hành Windows.

1

cho dòng sản phẩm mới có một tài sản

System.getProperty("line.separator") 

Dưới đây là ví dụ của bạn,

string.replaceAll("\n", System.getProperty("line.separator")); 
2

Chỉ cần thêm này cho đầy đủ, bởi vì điều 2 dấu chéo ngược là có thật.

Tham khảo @dasblinkenlight câu trả lời trong SO câu dưới đây (nói về \ t nhưng nó áp dụng cho \ n cũng):

java, regular expression, need to escape backslash in regex

"Có hai cách giải thích của chuỗi thoát xảy ra: thứ nhất Khi trình biên dịch Java thấy hai dấu gạch chéo, nó sẽ thay thế chúng bằng một dấu gạch chéo đơn. dấu gạch chéo, Java lá nó một mình. Tuy nhiên, bởi vì hai dấu gạch chéo đã được thay thế bằng một dấu gạch chéo đơn, công cụ regexp thấy \ t, và giải thích nó như là một tab. "

+0

Điều khác đang xảy ra là arg đầu tiên để replaceAll có thể là một chuỗi phẳng hoặc một regex. Trong chuỗi "\ n" được hiểu là chữ, nhưng nếu bạn chỉ bao gồm các ký tự regex khác, như dấu ngoặc cho tập hợp char, thì bạn cần thêm dấu gạch chéo để có chuỗi chính xác tới trình biên dịch regex, như bạn nói. ..... ví dụ: "[\\ r \\ n] +" – Rondo

10

Vì công cụ regex Java 8 hỗ trợ \R đại diện cho bất kỳ dấu tách dòng nào (ít thông tin hơn: https://stackoverflow.com/a/31060125/1393766).

Vì vậy, nếu bạn có quyền truy cập vào Java 8 bạn có thể sử dụng

string = string.replaceAll("\\R", " --linebreak-- "); 
Các vấn đề liên quan