วิธีการลบช่องว่างสีขาวที่ซ้ำกันในสตริงโดยใช้ Java?


147

วิธีลบช่องว่างสีขาวที่ซ้ำกัน (รวมถึงแท็บบรรทัดใหม่ช่องว่าง ฯลฯ ... ) ในสตริงโดยใช้ Java?

คำตอบ:


378

แบบนี้:

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

ตัวอย่างเช่น

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

เอาท์พุท

lorem ipsum dolor sit.

นั่น\s+หมายความว่าอย่างไร

\s+คือการแสดงออกปกติ \sตรงกับช่องว่างแท็บบรรทัดใหม่การขึ้นบรรทัดใหม่ฟีดฟอร์มหรือแท็บแนวตั้งและ+ระบุว่า "อย่างน้อยหนึ่งรายการเหล่านั้น" ดังนั้นรหัสข้างต้นจะยุบ "สตริงย่อยของช่องว่าง" ทั้งหมดที่ยาวเกินหนึ่งอักขระด้วยอักขระช่องว่างเดียว


แหล่งที่มา: Java: การลบช่องว่างสีขาวที่ซ้ำกันในสตริง


3
@SuhrobSamiev - String.replaceAll () อยู่ใน Java ตั้งแต่ JDK 1.4 docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles

3
ฉันหวังว่าฉันจะเพิ่มมากกว่า +1 ได้สำหรับคำอธิบายที่ยอดเยี่ยมของ \ s +
Cyntech

ฉันเข้าใจแล้ว\s+แต่เครื่องหมายแบ็กสแลช 2 อันหมายความว่าอะไร
saplingPro

2
สตริงตัวอักษร"\\"หมายถึงสตริงที่ประกอบด้วยเครื่องหมายทับขวาเดียว ดังนั้นเพื่อเป็นตัวแทนของคุณเขียน\s+ "\\s+"
aioobe

1
การทำเช่นนี้จะลบการขนส่งคืนหรือไม่ หรือฉันต้องลบ "\\ r" แยกต่างหาก ขอบคุณ!
user3388884

24

คุณสามารถใช้ 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}"," ");

9

ลองนี้ - คุณต้อง import java.util.regex.*;

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

stringสตริงของคุณอยู่ที่ไหนที่คุณต้องการลบช่องว่างสีขาวที่ซ้ำกัน


9

สวัสดีวิธีที่เร็วที่สุด (แต่ไม่ใช่วิธีที่สวยที่สุด) ที่ฉันพบคือ

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

นี่ใช้งานได้ค่อนข้างเร็วบน Android ตรงข้ามกับ regex


1
ใช้งานได้เฉพาะกับช่องว่าง แต่ไม่สามารถใช้ช่องว่างอื่น ๆ เช่นแท็บและบรรทัดใหม่
ปาง

1
ฉันรู้ว่าคุณต้องเพิ่มสิ่งเหล่านี้ในขณะที่ลูปสำหรับหน่วยงานอื่น ๆ แต่รหัสนี้ทำงานได้เร็วขึ้นมากบน Android เนื่องจาก regex เหล่านี้ฉันต้องดำเนินการ ebooks ฉบับสมบูรณ์
wutzebaer

เร็วขึ้นอย่างมากบนเดสก์ท็อปด้วย ยังไม่ได้ทดสอบมันสำหรับสตริงขนาดใหญ่ แต่ถ้าคุณวางแผนที่จะรันบนสตริงเล็ก ๆ จำนวนมากนี่คือคำตอบที่คุณต้องการ
Ivelate


6

แม้ว่ามันจะสายไปแล้ว แต่ฉันก็ได้พบวิธีแก้ปัญหาที่ดีกว่า (ใช้งานได้สำหรับฉัน) ที่จะแทนที่ช่องว่างสีขาวประเภทเดียวกันทั้งหมดต่อเนื่องกันด้วยช่องว่างสีขาวหนึ่งช่อง นั่นคือ:

   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

ฉันไม่พบวิธีแก้ไขปัญหาข้างต้นที่นี่ดังนั้นฉันได้โพสต์ไว้


0

หากคุณต้องการกำจัดช่องว่างชั้นนำและต่อท้ายจากภายนอกคุณต้องทำสิ่งนี้:

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

จากนั้นคุณสามารถลบรายการที่ซ้ำกันโดยใช้กลยุทธ์อื่น ๆ ที่ระบุไว้ที่นี่:

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

0

นอกจากนี้คุณยังสามารถลองใช้ String Tokeniser สำหรับพื้นที่แท็บขึ้นบรรทัดใหม่และทั้งหมด วิธีง่ายๆคือ

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

-10

สามารถทำได้ในสามขั้นตอน:

  1. แปลงสตริงเป็นอักขระอาร์เรย์ (ToCharArray)
  2. ใช้สำหรับลูปในอาร์เรย์ charater
  3. จากนั้นใช้ฟังก์ชั่นแทนที่สตริง (แทนที่ ("ต่อยที่คุณต้องการแทนที่", "สตริงเดิม"));

1
นั่นไม่ใช่ทางออกที่ดีการปล่อยไปยังอาร์เรย์ char ไม่สามารถแก้ปัญหาใด ๆ ได้ คุณไม่ได้อธิบายวิธีการเปลี่ยนซึ่งเป็นแกนหลักของปัญหา นอกจากนี้โปรดอย่าโพสต์ลิงก์ที่ไม่เกี่ยวข้องอย่างสมบูรณ์ คุณจะถูกตั้งค่าสถานะเป็นผู้ส่งสแปมหากคุณทำเช่นนั้น
Mat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.