วิธีลบช่องว่างสีขาวที่ซ้ำกัน (รวมถึงแท็บบรรทัดใหม่ช่องว่าง ฯลฯ ... ) ในสตริงโดยใช้ Java?
วิธีลบช่องว่างสีขาวที่ซ้ำกัน (รวมถึงแท็บบรรทัดใหม่ช่องว่าง ฯลฯ ... ) ในสตริงโดยใช้ Java?
คำตอบ:
แบบนี้:
yourString = yourString.replaceAll("\\s+", " ");
ตัวอย่างเช่น
System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " "));
เอาท์พุท
lorem ipsum dolor sit.
นั่น\s+
หมายความว่าอย่างไร
\s+
คือการแสดงออกปกติ \s
ตรงกับช่องว่างแท็บบรรทัดใหม่การขึ้นบรรทัดใหม่ฟีดฟอร์มหรือแท็บแนวตั้งและ+
ระบุว่า "อย่างน้อยหนึ่งรายการเหล่านั้น" ดังนั้นรหัสข้างต้นจะยุบ "สตริงย่อยของช่องว่าง" ทั้งหมดที่ยาวเกินหนึ่งอักขระด้วยอักขระช่องว่างเดียว
แหล่งที่มา: Java: การลบช่องว่างสีขาวที่ซ้ำกันในสตริง
\s+
แต่เครื่องหมายแบ็กสแลช 2 อันหมายความว่าอะไร
"\\"
หมายถึงสตริงที่ประกอบด้วยเครื่องหมายทับขวาเดียว ดังนั้นเพื่อเป็นตัวแทนของคุณเขียน\s+
"\\s+"
คุณสามารถใช้ regex
(\s)\1
และ
$1
แทนที่ด้วย
รหัส Java:
str = str.replaceAll("(\\s)\\1","$1");
หากอินพุตคือ"foo\t\tbar "
คุณจะได้รับ"foo\tbar "
เป็นเอาต์พุต
แต่ถ้าอินพุต"foo\t bar"
นั้นจะไม่เปลี่ยนแปลงเนื่องจากไม่มีอักขระช่องว่างต่อเนื่อง
ถ้าคุณรักษาทุกตัวอักษรช่องว่าง (ช่องว่าง, แท็บแนวตั้งแนวนอนแท็บกลับสายการบินอาหารรูปแบบบรรทัดใหม่) เป็นพื้นที่แล้วคุณสามารถใช้ regex ต่อไปนี้เพื่อแทนที่ใด ๆจำนวนพื้นที่สีขาวต่อเนื่องกับพื้นที่เดียว:
str = str.replaceAll("\\s+"," ");
แต่ถ้าคุณต้องการแทนที่พื้นที่สีขาวต่อเนื่องสองช่องด้วยช่องว่างเดียวคุณควรทำ:
str = str.replaceAll("\\s{2}"," ");
ลองนี้ - คุณต้อง import java.util.regex.*;
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(string);
boolean check = matcher.find();
String str = matcher.replaceAll(" ");
string
สตริงของคุณอยู่ที่ไหนที่คุณต้องการลบช่องว่างสีขาวที่ซ้ำกัน
สวัสดีวิธีที่เร็วที่สุด (แต่ไม่ใช่วิธีที่สวยที่สุด) ที่ฉันพบคือ
while (cleantext.indexOf(" ") != -1)
cleantext = StringUtils.replace(cleantext, " ", " ");
นี่ใช้งานได้ค่อนข้างเร็วบน Android ตรงข้ามกับ regex
String str = " Text with multiple spaces ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
แม้ว่ามันจะสายไปแล้ว แต่ฉันก็ได้พบวิธีแก้ปัญหาที่ดีกว่า (ใช้งานได้สำหรับฉัน) ที่จะแทนที่ช่องว่างสีขาวประเภทเดียวกันทั้งหมดต่อเนื่องกันด้วยช่องว่างสีขาวหนึ่งช่อง นั่นคือ:
Hello!\n\n\nMy World
จะ
Hello!\nMy World
สังเกตว่ายังมีช่องว่างสีขาวนำหน้าและต่อท้าย ดังนั้นโซลูชันที่สมบูรณ์ของฉันคือ:
str = str.trim().replaceAll("(\\s)+", "$1"));
ที่นี่trim()
จะแทนที่สตริงพื้นที่สีขาวนำหน้าและต่อท้ายด้วย "" (\\s)
สำหรับการจับภาพ\\s
(นั่นคือช่องว่างสีขาวเช่น '', '\ n', '\ t) ในกลุ่มที่ 1 +
เครื่องหมายสำหรับการจับคู่ 1 หรือมากกว่าโทเค็นก่อนหน้านี้ ดังนั้น(\\s)+
สามารถเป็นอักขระต่อเนื่องกัน (1 หรือมากกว่า) ในบรรดาอักขระช่องว่างสีขาว ('', '\ n' หรือ '\ t') $1
ใช้สำหรับแทนที่สตริงการจับคู่ด้วยสตริงกลุ่ม # 1 (ซึ่งมีเพียงอักขระสีขาว 1 ตัวเท่านั้น) ของประเภทการจับคู่ (นั่นคืออักขระช่องว่างสีขาวเดียวซึ่งมีการจับคู่) วิธีการแก้ปัญหาข้างต้นจะเปลี่ยนดังนี้:
Hello!\n\n\nMy World
จะ
Hello!\nMy World
ฉันไม่พบวิธีแก้ไขปัญหาข้างต้นที่นี่ดังนั้นฉันได้โพสต์ไว้
หากคุณต้องการกำจัดช่องว่างชั้นนำและต่อท้ายจากภายนอกคุณต้องทำสิ่งนี้:
// \\A = Start of input boundary
// \\z = End of input boundary
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");
จากนั้นคุณสามารถลบรายการที่ซ้ำกันโดยใช้กลยุทธ์อื่น ๆ ที่ระบุไว้ที่นี่:
string = string.replaceAll("\\s+"," ");
นอกจากนี้คุณยังสามารถลองใช้ String Tokeniser สำหรับพื้นที่แท็บขึ้นบรรทัดใหม่และทั้งหมด วิธีง่ายๆคือ
String s = "Your Text Here";
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
System.out.print(st.nextToken());
}
สามารถทำได้ในสามขั้นตอน: