Làm cách nào để loại bỏ các khoảng trắng trùng lặp trong chuỗi bằng Java?


147

Làm cách nào để xóa các khoảng trắng trùng lặp (bao gồm các tab, dòng mới, dấu cách, v.v.) trong một chuỗi bằng Java?

Câu trả lời:


378

Như thế này:

yourString = yourString.replaceAll("\\s+", " ");

Ví dụ

System.out.println("lorem  ipsum   dolor \n sit.".replaceAll("\\s+", " "));

đầu ra

lorem ipsum dolor sit.

Điều đó \s+có nghĩa là gì?

\s+là một biểu thức chính quy. \skhớp với một khoảng trắng, tab, dòng mới, trả về vận chuyển, nguồn cấp dữ liệu mẫu hoặc tab dọc và +nói "một hoặc nhiều trong số đó". Do đó, đoạn mã trên sẽ thu gọn tất cả "chuỗi con khoảng trắng" dài hơn một ký tự, với một ký tự khoảng trắng.


Nguồn: Java: Loại bỏ các khoảng trắng trùng lặp trong chuỗi


3
@SuhrobSamiev - String.replaceAll () đã có trong Java kể từ JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/iêu , java.lang.String)
David Moles

3
Tôi ước tôi có thể thêm nhiều hơn +1 cho lời giải thích tuyệt vời về \ s +.
Cyntech

Tôi đã hiểu \s+nhưng 2 dấu gạch chéo ngược có nghĩa là gì?
saplingPro

2
Chuỗi ký tự "\\"đại diện cho chuỗi bao gồm một dấu gạch chéo ngược đơn. Vì vậy, để đại diện cho \s+bạn viết "\\s+".
aioobe

1
Điều này sẽ loại bỏ vận chuyển trở lại? hoặc tôi sẽ phải loại bỏ "\ r" riêng biệt? Cảm ơn!
dùng3388884

24

Bạn có thể sử dụng regex

(\s)\1

thay thế nó bằng $1.

Mã Java:

str = str.replaceAll("(\\s)\\1","$1");

Nếu đầu vào là "foo\t\tbar "bạn sẽ nhận "foo\tbar "làm đầu ra
Nhưng nếu đầu vào là "foo\t bar"nó sẽ không thay đổi vì nó không có bất kỳ ký tự khoảng trắng liên tiếp nào.

Nếu bạn coi tất cả các ký tự khoảng trắng (khoảng trắng, tab dọc, tab ngang, trả về vận chuyển, nguồn cấp mẫu, dòng mới) thì bạn có thể sử dụng biểu thức chính sau để thay thế bất kỳ số lượng khoảng trắng liên tiếp nào bằng một khoảng trắng:

str = str.replaceAll("\\s+"," ");

Nhưng nếu bạn muốn thay thế hai khoảng trắng liên tiếp bằng một khoảng trắng, bạn nên làm:

str = str.replaceAll("\\s{2}"," ");

9

Hãy thử điều này - Bạn phải import java.util.regex.*;

    Pattern pattern = Pattern.compile("\\s+");
    Matcher matcher = pattern.matcher(string);
    boolean check = matcher.find();
    String str = matcher.replaceAll(" ");

Trong trường hợp stringlà chuỗi của bạn mà bạn cần phải loại bỏ không gian trắng trùng lặp


9

chào cách nhanh nhất (nhưng không đẹp nhất) tôi tìm thấy là

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

Điều này đang chạy khá nhanh trên Android ngược lại với regex


1
Chỉ hoạt động cho không gian chứ không phải các khoảng trắng khác như tab và dòng mới.
Pang

1
tôi biết, bạn phải thêm nhiều thứ này trong khi các vòng lặp cho các thực thể khác. Nhưng mã này chạy nhanh hơn nhiều trên Android vì các regex này, tôi đã phải xử lý hoàn thành các ebook.
wutzebaer

Nhanh hơn rất nhiều trên máy tính để bàn quá. Không thử nghiệm nó cho một chuỗi lớn, nhưng nếu bạn có kế hoạch chạy nó trên nhiều chuỗi nhỏ thì đây là câu trả lời bạn đang tìm kiếm.
Ivelate

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

Mặc dù đã quá muộn, tôi đã tìm ra một giải pháp tốt hơn (phù hợp với tôi) sẽ thay thế tất cả các khoảng trắng cùng loại liên tiếp bằng một khoảng trắng cùng loại. Đó là:

   Hello!\n\n\nMy    World  

sẽ là

 Hello!\nMy World 

Lưu ý rằng vẫn còn khoảng trắng hàng đầu và dấu. Vì vậy, giải pháp hoàn chỉnh của tôi là:

str = str.trim().replaceAll("(\\s)+", "$1"));

Ở đây, trim()thay thế tất cả các chuỗi khoảng trắng hàng đầu và dấu bằng "". (\\s)là để chụp \\s(đó là các khoảng trắng như '', '\ n', '\ t') trong nhóm # 1 . +dấu hiệu phù hợp với 1 hoặc nhiều mã thông báo trước. Vì vậy, (\\s)+có thể là các ký tự liên tiếp (1 hoặc nhiều hơn) trong số bất kỳ ký tự khoảng trắng đơn nào ('', '\ n' hoặc '\ t'). $1là để thay thế các chuỗi phù hợp bằng chuỗi số 1 (chỉ chứa 1 ký tự khoảng trắng) của loại đối sánh (đó là ký tự khoảng trắng đơn đã khớp). Giải pháp trên sẽ thay đổi như thế này:

   Hello!\n\n\nMy    World  

sẽ là

Hello!\nMy World

Tôi không tìm thấy giải pháp trên của tôi ở đây vì vậy tôi đã đăng nó.


0

Nếu bạn muốn thoát khỏi tất cả các khoảng trắng bên ngoài hàng đầu và dấu vết thì bạn muốn làm một cái gì đó như thế này:

// \\A = Start of input boundary
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");

Sau đó, bạn có thể xóa các bản sao bằng cách sử dụng các chiến lược khác được liệt kê ở đây:

string = string.replaceAll("\\s+"," ");

0

Bạn cũng có thể thử sử dụng String Tokeniser, cho mọi không gian, tab, dòng mới và tất cả. Một cách đơn giản là,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

Điều này có thể có thể trong ba bước:

  1. Chuyển đổi chuỗi thành mảng ký tự (ToCharArray)
  2. Áp dụng cho vòng lặp trên mảng charater
  3. Sau đó áp dụng chức năng thay thế chuỗi (Thay thế ("sting bạn muốn thay thế", "chuỗi gốc"));

1
Đó không phải là một giải pháp tốt, thả vào một mảng char không giải quyết được gì. Bạn không thực sự giải thích làm thế nào để thay thế, đó là cốt lõi của vấn đề. Ngoài ra xin đừng đăng liên kết hoàn toàn không liên quan. Bạn sẽ bị gắn cờ là người gửi thư rác nếu bạn làm như vậy.
Mat
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.