การลบช่องว่างออกจากสตริงใน Java


684

ฉันมีสตริงเช่นนี้:

mysz = "name=john age=13 year=2001";

ฉันต้องการลบช่องว่างในสตริง ฉันพยายามtrim()แต่สิ่งนี้ลบเฉพาะช่องว่างก่อนและหลังสตริงทั้งหมด ฉันพยายามreplaceAll("\\W", "")แล้ว แต่ก็=ยังถูกลบออก

ฉันจะได้รับสตริงด้วย:

mysz2 = "name=johnage=13year=2001"

1
\\Wหมายถึงคำที่ไม่ใช่คำทั้งหมดดูdownload.oracle.com/javase/6/docs/api/java/util/regex/
......

76
แผนของคุณกับสตริง "name = johnage = 13year = 2001" คืออะไร? ไม่ต้องแยกมันฉันหวังว่า
Jonas Elfström

4
@ JonasElfströmฉันคิดว่ามันจะช่วยให้มีการเปรียบเทียบสตริง
Isaac

ถ้าสตริงเป็นจริง = "" ทุกสิ่งที่จดจ้อง () ไม่ล้างสตริงที่ว่างเปล่าเหมือนกับที่ฉันพูดถึง? @zyamat?
gumuruh

มีความเป็นไปได้ที่ซ้ำกันของวิธีลบ white space ในสตริง java
KIBOU Hassan

คำตอบ:


1289

st.replaceAll("\\s+","")ลบช่องว่างทั้งหมดและอักขระที่มองไม่เห็น (เช่นแท็บ\n)


st.replaceAll("\\s+","")และst.replaceAll("\\s","")สร้างผลลัพธ์เดียวกัน

Regex ตัวที่สองเร็วกว่าอันแรก 20% แต่เมื่อเพิ่มช่องว่างติดต่อกันจำนวนมากอันแรกจะทำงานได้ดีกว่าอันที่สอง


กำหนดค่าให้กับตัวแปรหากไม่ได้ใช้โดยตรง:

st = st.replaceAll("\\s+","")

34
ฉันต้องการทราบว่า regex ทั้งสองนี้จะให้ผลลัพธ์ที่แตกต่างกันหากคุณต้องการแทนที่ช่องว่างทั้งหมดด้วยช่องว่างเดียว (หรือชุดอักขระอื่น) หากคุณมีช่องว่างติดต่อกันการใช้ \\ s จะเป็นการแทนที่อักขระช่องว่างแต่ละรายการด้วยอักขระที่ให้มา รับ \\ s + มันจะแทนที่แต่ละชุดของช่องว่างด้วยสตริงการแทนที่เดียว ฉันเห็นบางกรณีที่ผู้คนอาจมาที่โพสต์นี้เพื่อแทนที่ช่องว่างด้วยสิ่งที่ไม่ได้เป็นเพียงสตริงว่างเปล่าและสิ่งนี้อาจเป็นประโยชน์
Caitlin

2
แต่จะไม่ลบ white-space ถ้าอยู่ที่จุดเริ่มต้นของสตริง
เหงา

@ โดดเดี่ยวใช้. trim () สำหรับเรื่องนั้น
CQM

6
เพียงใช้ StringUtils จาก apache-commons มันเป็นวิธีการคงที่เรียกว่า StringUtils.deleteWhitespace
Crozeta

@ Gursel ขอบคุณสำหรับคำตอบและการเปรียบเทียบประสิทธิภาพสำหรับสอง regex ฉันสงสัยว่าทำไมถึงมีความแตกต่างระหว่างสองอย่าง มีอะไรที่ฉันขาดหายไปคุณช่วยชี้ให้ฉันดูการอ้างอิงที่พูดถึงความแตกต่างของประสิทธิภาพการทำงานที่นั่นได้ไหม
Vishrant

248
replaceAll("\\s","")

\w = ทุกอย่างที่เป็นตัวอักษรคำ

\W = อะไรก็ได้ที่ไม่ใช่ตัวอักษรของคำ (รวมถึงเครื่องหมายวรรคตอนและอื่น ๆ )

\s = อะไรก็ได้ที่เป็นอักขระเว้นวรรค (รวมถึงช่องว่างอักขระแท็บ ฯลฯ )

\S = อะไรก็ได้ที่ไม่ใช่อักขระเว้นวรรค (รวมถึงทั้งตัวอักษรและตัวเลขรวมถึงเครื่องหมายวรรคตอนและอื่น ๆ )

(แก้ไข: ตามที่ระบุไว้คุณจะต้องหลีกเลี่ยงแบ็กสแลชหากคุณต้องการ\sเข้าถึงเอ็นจิน regex ซึ่งจะทำให้เกิด\\s)


103

คำตอบที่ถูกต้องที่สุดสำหรับคำถามคือ:

String mysz2 = mysz.replaceAll("\\s","");

ฉันเพิ่งดัดแปลงรหัสนี้จากคำตอบอื่น ๆ ฉันโพสต์มันเพราะนอกจากจะเป็นสิ่งที่คำถามที่ร้องขอมันยังแสดงให้เห็นว่าผลลัพธ์จะถูกส่งกลับเป็นสตริงใหม่สตริงเดิมไม่ได้ถูกแก้ไขตามคำตอบบางส่วนของนัย

(นักพัฒนา Java ที่มีประสบการณ์อาจพูดว่า "แน่นอนคุณไม่สามารถแก้ไขสตริงได้" แต่กลุ่มเป้าหมายสำหรับคำถามนี้อาจไม่รู้เรื่องนี้เป็นอย่างดี)


นี่หมายความว่าเราสามารถเขียนทับสตริงเดิมโดยเขียนตัวอย่างเช่น: S = S.replaceAll ("\\ s", ""); ในขณะที่การเปลี่ยนครั้งแรกจะเสร็จสิ้นจากนั้น S จะได้รับเวอร์ชันตัวอักษรที่ถูกกดของ S
frogeyedpeas

@frogeyedpeas ที่เขียนทับตัวแปรSแต่ไม่ได้เขียนทับสตริงที่Sชี้ไป
Reinstate Monica

บันทึกวันของฉัน! ;)
Paras Jain

62

replaceAll("\\s", "")วิธีการเกี่ยวกับ โปรดดูที่นี่


50
สิ่งที่แตกต่างจากการไปสายสามารถทำให้!
HDave

45

วิธีหนึ่งในการจัดการการจัดการสตริงคือ StringUtils จาก Apache ทั่วไป

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

คุณสามารถค้นหาได้ที่นี่ commons-lang มีจำนวนมากขึ้นและได้รับการสนับสนุนเป็นอย่างดี


นี่เป็นข้อดีของการอ่านง่ายขึ้น
เพ

36

หากคุณต้องการลบช่องว่างที่ไม่สามารถแตกได้เช่นกันคุณสามารถอัพเกรดรหัสของคุณดังนี้:

st.replaceAll("[\\s|\\u00A0]+", "");

สิ่งนี้ล้มเหลวสำหรับ: " ab c "
Mohd Farid

1
@MohdFarid ใช้การแก้ไขต้องเป็นไรตอนนี้
Denis Kulagin

ฉันคิดว่ามันควรเป็น st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk

30

หากคุณต้องการคลาสยูทิลิตี้เพื่อ regexes มีวิธีการtrimAllWhitespace (String)ใน StringUtils ใน Spring Framework


13
ยินดีต้อนรับแนวคิดทางเลือก พวกเขาจะช่วยบางคนแม้ว่าจะไม่ใช่ทุกคน
james.garriss

25

คุณได้รับคำตอบที่ถูกต้องจาก Gursel Koca แล้ว แต่ฉันเชื่อว่ามีโอกาสดีที่นี่ไม่ใช่สิ่งที่คุณต้องการจะทำ วิธีการแยกวิเคราะห์คีย์ - ค่าแทน?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

ผลลัพธ์:
name = john
age = 13
year = 2001


22

คุณควรใช้

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

แทน:

s.replaceAll("\\s", "");

ด้วยวิธีนี้มันจะทำงานกับมากกว่าหนึ่งช่องว่างระหว่างแต่ละสาย เครื่องหมาย + ใน regex ข้างต้นหมายถึง "หนึ่งหรือมากกว่า \ s"


2
ฉันพิมพ์ตัวอย่างสั้น ๆ เพื่อตรวจสอบสิ่งนี้เพราะฟังดูแปลกสำหรับฉันและพบว่าไม่จำเป็นต้องมีเครื่องหมายบวก มีการใช้ช่องว่างหลายคำในการแยกคำ เหตุผลนี้มีแนวโน้มมากที่สุดที่จะreplaceAllทำซ้ำจนกว่ารูปแบบจะไม่ตรงกับส่วนใด ๆ ของสตริง
nyaray

2
จริง +อาจจะทำให้ CPU เล็กน้อยเป็นมิตรมากขึ้นเพราะช่องว่างติดต่อกันจะถูกจัดการในครั้งเดียวแทนการดำเนินการ แต่ที่แตกต่างในกรณีนี้ แน่นอนว่าAllไม่ใช่สิ่ง+ที่แทนที่ช่องว่างที่ไม่ต่อเนื่องในสตริง
nitro2k01

จะไม่ลบสิ่งนี้ (u00A0)
Kerim FIRAT

8

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้org.apache.commons.lang3.StringUtilsคลาสของcommons-lang3ไลบรารีเช่น " commons-lang3-3.1.jar"

ใช้วิธีการคงที่ " StringUtils.deleteWhitespace(String str)" ในสตริงอินพุตของคุณและมันจะคืนค่าสตริงให้คุณหลังจากลบช่องว่างสีขาวทั้งหมดออกจากมัน ฉันลองสตริงตัวอย่างของคุณ " name=john age=13 year=2001" และมันคืนสตริงตรงที่คุณต้องการ - " name=johnage=13year=2001" ให้ฉัน หวังว่านี่จะช่วยได้


7

คุณสามารถทำได้ง่ายๆโดย

String newMysz = mysz.replace(" ","");

น่าประหลาดใจที่คนงานคนเดียวในสถานการณ์ของฉัน ขอบคุณ
Valeriy

6
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// มันใช้ได้ดีกับช่องว่างใด ๆ * อย่าลืมพื้นที่ในการต่อย b


มีประโยชน์มาก แต่ไม่ตอบคำถามที่โพสต์!
BuvinJ

3

\Wหมายถึง "ตัวอักษรที่ไม่ใช่คำ" \sรูปแบบตัวอักษรช่องว่างคือ นี้เป็นเอกสารที่ดีในJavadoc แบบ


8
ส่วนที่เหลือของคำตอบนี้อยู่ที่ไหน
LS

3

ในจาวาเราสามารถทำการดำเนินการต่อไปนี้:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

สำหรับสิ่งนี้คุณต้องนำเข้าแพ็คเกจต่อไปนี้ในโปรแกรมของคุณ:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

ฉันหวังว่ามันจะช่วยคุณ


ข้อมูลอื่น ๆ นี้จัดทำโดยหลายปีก่อนที่คุณจะโพสต์คำตอบของคุณ
jan groth

3

การใช้รูปแบบและตัวจับมันเป็นแบบไดนามิกมากขึ้น

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}


3

ใช้คลาส apache string util จะดีกว่าเพื่อหลีกเลี่ยง NullPointerException

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

เอาท์พุต

abcdef


2
mysz = mysz.replace(" ","");

ที่หนึ่งที่มีพื้นที่ที่สองที่ไม่มีพื้นที่

จากนั้นก็จะทำ


7
[ \t\n\x0B\f\r]เพียงชี้แจงหมายถึงช่องว่าง คุณกำลังทำ[ ]พื้นที่ปกติเท่านั้น
GKFX

2
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}


1

หากต้องการลบช่องว่างในตัวอย่างของคุณนี่เป็นอีกวิธีในการดำเนินการ:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

สิ่งนี้จะทำอย่างไรจึงแปลงเป็นอาเรย์ด้วยช่องว่างที่เป็นตัวคั่นและรวมไอเท็มต่างๆในอาเรย์เข้าด้วยกันโดยไม่ต้องเว้นวรรค

มันใช้งานได้ดีและเข้าใจง่าย


2
แต่ทางออกที่ไม่มีประสิทธิภาพมาก และอย่างที่คุณเห็นจากวิธีแก้ปัญหาอื่น - นี่ใช้ได้กับพื้นที่เท่านั้น "" และไม่ใช่สำหรับพื้นที่ว่างที่ต่างกัน
GhostCat

1

มีคนอื่นพื้นที่ถ่านอยู่เกินไปในสตริง .. ดังนั้นถ่านอวกาศเราอาจต้องแทนที่จากสตริง

ตัวอย่าง: ไม่มีการแบ่งพื้นที่, พื้นที่สามต่อ EM, พื้นที่การทำ PUNCTUATION

นี่คือรายการของ space char http://jkorpela.fi/chars/spaces.html

ดังนั้นเราต้องแก้ไข

\ u2004 เราใช้พื้นที่สามต่อ EM

s.replaceAll ( "[\ u0020 \ u2004]", "")


0

พื้นที่สีขาวสามารถลบได้โดยใช้ฟังก์ชั่น isWhitespace จาก Character Class

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

0

แยกแต่ละกลุ่มของข้อความเป็นสตริงย่อยของตัวเองแล้วเชื่อมต่อสตริงย่อยเหล่านั้น:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

0
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

สิ่งนี้อาจช่วยได้


0

คุณสามารถดูรหัส Java ด้านล่าง รหัสต่อไปนี้ไม่ได้ใช้วิธีการ "ในตัว" ใด ๆ

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

การป้อนข้อมูล:

String inp = "01239Debashish123Pattn456aik";

เอาท์พุท:

The String is: 01239123456

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

0

มีคำตอบค่อนข้างมาก ฉันต้องการให้วิธีแก้ปัญหาที่ค่อนข้างอ่านได้และดีกว่า regex

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

    public static void main(String[] args) throws IOException {

        String str1 = "\n\tThis is my string \n \r\n  !";

        System.out.println("[" + str1 + "]");

        System.out.println("Whitespace Removed:");

        System.out.println("[" + StringUtils.deleteWhitespace(str1) + "]");

        System.out.println();

    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.