Làm cách nào để loại bỏ ngắt dòng khỏi một tệp trong Java?


258

Làm cách nào tôi có thể thay thế tất cả các ngắt dòng từ một chuỗi trong Java theo cách sẽ hoạt động trên Windows và Linux (nghĩa là không có vấn đề cụ thể nào về hệ điều hành của việc trả lại dòng / nguồn cấp dữ liệu / dòng mới, v.v.)?

Tôi đã thử (lưu ý readFileAsString là một chức năng đọc tệp văn bản thành Chuỗi):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

nhưng điều này dường như không hoạt động.

Điều này có thể giải quyết như thế nào?


Bạn có muốn loại bỏ tất cả các ngắt dòng? Hoặc bạn muốn thống nhất chúng thành một giải pháp tiêu chuẩn?
helios

4
Ồ, nếu bạn muốn xóa tất cả các nguồn cấp, hãy xóa tất cả \ n VÀ tất cả \ r (vì Windows linebreak là \ r \ n).
helios

Xin chào, FYI nếu bạn có thể muốn thay thế các ngắt dòng đột ngột đồng thời bằng ngắt dòng đơn thì bạn có thể sử dụng myString.trim().replaceAll("[\n]{2,}", "\n") Hoặc thay thế bằng một khoảng myString.trim().replaceAll("[\n]{2,}", " ")
trắng

Câu trả lời:


435

Bạn cần đặt thành textkết quả của text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

Điều này là cần thiết bởi vì Chuỗi là bất biến - việc gọi replacekhông thay đổi Chuỗi ban đầu, nó trả về một chuỗi mới đã được thay đổi. Nếu bạn không gán kết quả cho text, thì Chuỗi mới đó sẽ bị mất và rác được thu thập.

Đối với việc nhận Chuỗi dòng mới cho bất kỳ môi trường nào - có sẵn bằng cách gọi System.getProperty("line.separator") .


1
+1, đúng. Theo lý do: Chuỗi là bất biến . Các replace()phương pháp trả về kết quả mong muốn. Đồng thời xem các tài liệu API: java.sun.com/javase/6/docs/api/java/lang/ mẹo Chỉnh sửa: ah bạn đã tự chỉnh sửa nó sau đó :)
BalusC

75
Có lẽ text = text.replace("\r\n", " ").replace("\n", " ");là một giải pháp tốt hơn: nếu không các từ sẽ được "dán" vào nhau (không có sự thay thế một không gian).
Bart Kiers

9
Bạn cũng có thể sử dụng dấu ngoặc vuông để khớp dòng mới cho bất kỳ HĐH nào:.replaceAll("[\\r\\n]+", "")
Yeti

2
Vì câu hỏi đang yêu cầu thay thế TẤT CẢ các lần xuất hiện, giải pháp khá hơntext = text.replaceAll("\n", "").replaceAll("\r", "");
basZero

2
@basZero replaceAllmất trong regex, replacelấy chuỗi theo nghĩa đen, cả hai thay thế tất cả các lần xuất hiện.
Joonas Vali

220

Như đã lưu ý trong các câu trả lời khác, mã của bạn không hoạt động chủ yếuString.replace(...)không thay đổi mục tiêuString . (Không thể - Chuỗi Java là bất biến!) Điều replacethực sự làm là tạo và trả về một Stringđối tượng mới với các ký tự được thay đổi theo yêu cầu. Nhưng mã của bạn sau đó ném đi rằng String...


Dưới đây là một số giải pháp có thể. Cái nào đúng nhất phụ thuộc vào chính xác những gì bạn đang cố gắng làm.

// #1
text = text.replace("\n", "");

Đơn giản chỉ cần loại bỏ tất cả các ký tự dòng mới. Điều này không đối phó với việc chấm dứt dòng Windows hoặc Mac.

// #2
text = text.replace(System.getProperty("line.separator"), "");

Loại bỏ tất cả các đầu cuối dòng cho nền tảng hiện tại. Điều này không đối phó với trường hợp bạn đang cố xử lý (ví dụ) một tệp UNIX trên Windows hoặc ngược lại.

// #3
text = text.replaceAll("\\r|\\n", "");

Loại bỏ tất cả các đầu cuối dòng Windows, UNIX hoặc Mac. Tuy nhiên, nếu tệp đầu vào là văn bản, điều này sẽ ghép các từ; ví dụ

Goodbye cruel
world.

trở thành

Goodbye cruelworld.

Vì vậy, bạn thực sự có thể muốn làm điều này:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

trong đó thay thế mỗi dòng kết thúc bằng một khoảng trắng. Vì Java 8, bạn cũng có thể làm điều này:

// #5
text = text.replaceAll("\\R", " ");

Và nếu bạn muốn thay thế nhiều dấu phân cách dòng bằng một khoảng trắng:

// #6
text = text.replaceAll("\\R+", " ");

1
Đây là một câu trả lời TUYỆT VỜI. Kudos cho các ví dụ Java 8. Cảm ơn bạn vì sự giúp đỡ!
HankNessip

22

Nếu bạn muốn xóa chỉ các đầu cuối dòng hợp lệ trên HĐH hiện tại, bạn có thể thực hiện việc này:

text = text.replaceAll(System.getProperty("line.separator"), "");

Nếu bạn muốn đảm bảo xóa bất kỳ dấu phân cách dòng nào, bạn có thể làm như thế này:

text = text.replaceAll("\\r|\\n", "");

Hoặc, dài dòng hơn một chút, nhưng ít regexy hơn:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");

2
Để tránh việc dán các từ lại với nhau (như đã thảo luận trong các bình luận cho câu trả lời của Kaleb), cách tiếp cận regex có thể được sửa đổi thành text.replaceAll("(\\r|\\n)+", " ")và (giả sử tham lam là mặc định trong Java?), Bạn sẽ có một giải pháp chỉ với một khoảng trống cho mỗi chuỗi ký tự dòng mới.
Jørn Schou-Rode

19

Hàm này bình thường hóa tất cả các khoảng trắng, bao gồm cả ngắt dòng, thành các khoảng trắng đơn. Không chính xác những gì câu hỏi ban đầu yêu cầu, nhưng có khả năng làm chính xác những gì cần thiết trong nhiều trường hợp:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);

14

Điều này sẽ hiệu quả tôi đoán

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

Đảm bảo rằng bạn có cùng mã chính xác, thay vì mất ký tự "\ n" trong khi dán. Bởi vì nó nên làm việc. Có lẽ vì tôi đã quên dấu chấm phẩy cuối cùng (;) ở cuối.
JSBach

11
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

Làm việc hoàn hảo cho tôi sau khi tìm kiếm rất nhiều, đã thất bại với mọi dòng khác.


6

Linebreaks không giống nhau dưới windows / linux / mac. Bạn nên sử dụng System.getProperIES với thuộc tính line.separator.


3
String text = readFileAsString("textfile.txt").replace("\n","");

.replace trả về một chuỗi mới, các chuỗi trong Java là Bất biến.


3

Bạn có thể muốn đọc tập tin của bạn với một BufferedReader. Lớp này có thể chia đầu vào thành các dòng riêng lẻ mà bạn có thể lắp ráp theo ý muốn. Cách BufferedReadervận hành tự động nhận ra các quy ước kết thúc dòng của thế giới Linux, Windows và MacOS, bất kể nền tảng hiện tại.

Vì thế:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

Lưu ý rằng readLine()không bao gồm dấu kết thúc dòng trong chuỗi trả về. Đoạn mã trên nối thêm một khoảng trắng để tránh dán từ cuối cùng của dòng và từ đầu tiên của dòng tiếp theo.


3
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Mặc dù định nghĩa của trim () trong trang web oracle là "Trả về một bản sao của chuỗi, với khoảng trắng ở đầu và cuối được bỏ qua."

tài liệu bỏ qua để nói rằng các ký tự dòng mới (hàng đầu và dấu) cũng sẽ bị xóa.

Trong ngắn hạn String text = readFileAsString("textfile.txt").trim();cũng sẽ làm việc cho bạn. (Đã kiểm tra với Java 6)


1

Tôi thấy thật kỳ lạ khi StringUtils (Apache) chưa được đề cập ở đây.

bạn có thể xóa tất cả các dòng mới (hoặc bất kỳ sự xuất hiện nào khác của chuỗi con cho vấn đề đó) khỏi chuỗi bằng .replacephương thức

StringUtils.replace(myString, "\n", "");

Dòng này sẽ thay thế tất cả các dòng mới bằng chuỗi trống.

bởi vì dòng mới về mặt kỹ thuật là một ký tự, bạn có thể tùy ý sử dụng .replaceCharsphương thức sẽ thay thế các ký tự

StringUtils.replaceChars(myString, '\n', '');

StringUtils.replaceEachRepeatedly(myString, new String[]{"\n", "\t"}, new String[]{StringUtils.Empty, StringUtils.Empty});
Lucas Crawford

0

FYI nếu bạn có thể muốn thay thế ngắt dòng đồng thời bằng ngắt dòng đơn thì bạn có thể sử dụng

myString.trim().replaceAll("[\n]{2,}", "\n")

Hoặc thay thế bằng một không gian duy nhất

myString.trim().replaceAll("[\n]{2,}", " ")

0

Bạn có thể sử dụng apache commons IOUtils để lặp qua dòng và nối từng dòng vào StringBuilder. Và đừng quên đóng InputStream

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

0

Bạn có thể sử dụng các phương thức chung để thay thế bất kỳ char nào với bất kỳ char nào.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}


-2

Hãy thử làm điều này:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");

5
nếu bạn thay thế \nthì không \r\ncòn nữa nếu bạn thay thế \ n và có một \ n thì nó sẽ được thay thế để chỉ còn lại \.
Cướp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.