Làm cách nào để loại bỏ dòng mới từ đầu và cuối chuỗi (Java)?


128

Tôi có một chuỗi chứa một số văn bản theo sau là một dòng trống. Cách tốt nhất để giữ phần bằng văn bản, nhưng loại bỏ dòng mới khoảng trắng từ cuối?



1
Không, không phải vậy. Câu hỏi trong liên kết là hỏi về 'thay thế' chứ không phải ..
Faiz

Câu trả lời:


277

Sử dụng String.trim()phương pháp để loại bỏ khoảng trắng (dấu cách, dòng mới, v.v.) từ đầu và cuối chuỗi.

String trimmedString = myString.trim();

16
Câu hỏi là về dòng mới. Điều này loại bỏ nhiều hơn chỉ là các dòng mới
mmm

22
String.replaceAll("[\n\r]", "");

13
Bro, @JohnB Nó cũng sẽ loại bỏ tất cả các ký tự dòng mới ở giữa chuỗi. yêu cầu là chỉ loại bỏ ký tự dòng mới hàng đầu & dấu.
siddhartha

5

tl; dr

String cleanString = dirtyString.strip() ; // Call new `String::string` method.

String::strip…

String::trimPhương pháp cũ có một định nghĩa kỳ lạ về khoảng trắng .

Như đã thảo luận ở đây , Java 11 bổ sung các strip…phương thức mới cho Stringlớp. Chúng sử dụng một định nghĩa hiểu biết về Unicode hơn về khoảng trắng. Xem các quy tắc của định nghĩa này trong lớp JavaDoc cho Character::isWhitespace.

Mã ví dụ.

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

Hoặc bạn có thể tách chỉ hàng đầu hoặc chỉ khoảng trắng theo sau .

Bạn không đề cập chính xác những điểm mã nào tạo nên dòng mới của bạn. Tôi tưởng tượng dòng mới của bạn có thể được bao gồm trong danh sách các điểm mã được nhắm mục tiêu bởi strip:

  • Đó là một ký tự không gian Unicode (SPACE_SEPARATOR, LINE_SEPARATOR hoặc PARAGRAPH_SEPARATOR) nhưng cũng không phải là không gian không phá vỡ ('\ u00A0', '\ u2007', '\ u202F').
  • Đó là '\ t', U + 0009 TABULATION HORIZONTAL.
  • Đó là '\ n', U + 000A LINE FEED.
  • Đó là '\ u000B', BẢNG CHỨNG NHẬN U + 000B.
  • Đó là '\ f', MẪU U + 000C.
  • Đó là '\ r', U + 000D CARRIAGE TRẢ LẠI.
  • Đó là '\ u001C', U + 001C SEPARATOR.
  • Đó là '\ u001D', CÔNG CỤ TÌM KIẾM NHÓM U + 001D.
  • Đó là '\ u001E', U + 001E RECORD SEPARATOR.
  • Đó là '\ u001F', U + 0

4

Mã Java này thực hiện chính xác những gì được hỏi trong tiêu đề của câu hỏi, đó là "xóa các dòng mới từ đầu và cuối chuỗi-java":

String.replaceAll("^[\n\r]", "").replaceAll("[\n\r]$", "")

Chỉ xóa các dòng mới từ cuối dòng:

String.replaceAll("[\n\r]$", "")

Chỉ xóa các dòng mới từ đầu dòng:

String.replaceAll("^[\n\r]", "")

Bạn có thể cung cấp thêm bối cảnh cho câu trả lời của bạn? Bằng cách đó mọi người có thể hiểu mã của bạn làm gì và tại sao.
Mariano Zorrilla

Tôi đã thêm lời giải thích cho câu trả lời của tôi. Tôi hy vọng rằng bây giờ nó là rõ ràng.
Alexander Samoylov


1
String trimStartEnd = "\n TestString1 linebreak1\nlinebreak2\nlinebreak3\n TestString2 \n";
System.out.println("Original String : [" + trimStartEnd + "]");
System.out.println("-----------------------------");
System.out.println("Result String : [" + trimStartEnd.replaceAll("^(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])|(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])$", "") + "]");
  1. Bắt đầu một chuỗi = ^,
  2. Kết thúc chuỗi = $,
  3. kết hợp regex = | ,
  4. Ngắt dòng = \ r \ n | [\ n \ x0B \ x0C \ r \ u0085 \ u2028 \ u2029]

0

Tôi cũng sẽ thêm một câu trả lời cho câu hỏi này bởi vì, trong khi tôi có cùng một câu hỏi, câu trả lời được cung cấp không đủ. Suy nghĩ một chút, tôi nhận ra rằng điều này có thể được thực hiện rất dễ dàng với một biểu thức thông thường.

Để xóa dòng mới từ đầu:

// Trim left
String[] a = "\n\nfrom the beginning\n\n".split("^\\n+", 2);

System.out.println("-" + (a.length > 1 ? a[1] : a[0]) + "-");

và kết thúc chuỗi:

// Trim right
String z = "\n\nfrom the end\n\n";

System.out.println("-" + z.split("\\n+$", 2)[0] + "-");

Tôi chắc chắn rằng đây không phải là cách hiệu quả nhất để cắt xén một chuỗi. Nhưng nó dường như là cách sạch nhất và đơn giản nhất để nội tuyến một hoạt động như vậy.

Lưu ý rằng cùng một phương pháp có thể được thực hiện để cắt bất kỳ biến thể và kết hợp các ký tự nào từ hai đầu vì đây là một biểu thức đơn giản.


Vâng, nhưng nếu bạn không biết có bao nhiêu dòng ở đầu / cuối thì sao? Giải pháp của bạn cho rằng có chính xác 2 dòng mới trong cả hai trường hợp
Luka Gondič 17/07/18

Tham số thứ hai split()chỉ là giới hạn. Bỏ nó đi nếu bạn muốn kết hợp không giới hạn số lần.
Zhro 17/07/18

0

Bạn có thể sử dụng các biểu thức thông thường để loại bỏ trả về vận chuyển ( \\r) và nguồn cấp dữ liệu ( \\n) từ đầu ( ^) và kết thúc ( $) của chuỗi:

 s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)")

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

2
Điều này không trả lời chính xác câu hỏi. Nó loại bỏ tất cả CR và LF, không chỉ những người ở đầu và cuối.
james.garriss

Điều này sẽ thay thế tất cả, không chỉ từ đầu và cuối.
Hamzeh Soboh
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.