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?
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:
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. \s
khớ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.
\s+
nhưng 2 dấu gạch chéo ngược có nghĩa là gì?
"\\"
đạ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+"
.
Bạn có thể sử dụng regex
(\s)\1
và
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}"," ");
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 string
là 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
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
String str = " Text with multiple spaces ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
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'). $1
là để 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ó.
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+"," ");
Điều này có thể có thể trong ba bước: