Xóa khoảng trắng khỏi chuỗi trong Java


684

Tôi có một chuỗi như thế này:

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

Tôi muốn loại bỏ các khoảng trắng trong chuỗi. Tôi đã thử trim()nhưng điều này chỉ loại bỏ khoảng trắng trước và sau toàn bộ chuỗi. Tôi cũng đã thử replaceAll("\\W", "")nhưng sau đó =cũng được gỡ bỏ.

Làm thế nào tôi có thể đạt được một chuỗi với:

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

1
\\Wcó nghĩa là tất cả các từ không phải xem download.oracle.com/javase/6/docs/api/java/util/regex/
mẹo

75
Kế hoạch của bạn với chuỗi "name = johnage = 13year = 2001" là gì? Không để phân tích nó tôi hy vọng.
Jonas Elfström

4
@ JonasElfström Tôi tưởng tượng nó sẽ giúp so sánh chuỗi
Isaac

làm thế nào nếu chuỗi thực sự = "". Có phải tất cả những gì trims () làm là xóa chuỗi trống giống như tôi đã đề cập? @zyamat?
gumuruh

Câu trả lời:


1287

st.replaceAll("\\s+","")xóa tất cả các khoảng trắng và các ký tự không nhìn thấy (ví dụ: tab, \n).


st.replaceAll("\\s+","")st.replaceAll("\\s","")tạo ra kết quả tương tự.

Regex thứ hai nhanh hơn 20% so với cái đầu tiên, nhưng khi số lượng không gian liên tiếp tăng lên, cái thứ nhất hoạt động tốt hơn cái thứ hai.


Gán giá trị cho một biến, nếu không được sử dụng trực tiếp:

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

34
Tôi muốn lưu ý rằng hai regex này sẽ tạo ra các kết quả khác nhau nếu bạn đang tìm cách thay thế tất cả các khoảng trắng bằng một khoảng trắng (hoặc một số bộ ký tự khác). Nếu bạn có các khoảng trắng liên tiếp, sử dụng \ s, nó sẽ thay thế từng ký tự khoảng trắng bằng các ký tự được cung cấp. Đã cho \ s + nó sẽ thay thế từng bộ khoảng trắng bằng một chuỗi thay thế duy nhất. Tôi có thể thấy khá nhiều trường hợp mọi người có thể đến bài đăng này để thay thế khoảng trắng bằng thứ gì đó không chỉ là một chuỗi trống và điều này có thể hữu ích.
Caitlin

2
nhưng nó không xóa khoảng trắng nếu nó ở đầu chuỗi.
cô đơn

@lonesome sử dụng .trim () cho điều đó
CQM

6
Chỉ cần sử dụng StringUtils từ apache-commons. Đây là một phương thức tĩnh có tên StringUtils.deleteWhitespace.
Crozeta

@Gursel cảm ơn câu trả lời và so sánh hiệu suất cho hai regex. Tôi đã tự hỏi tại sao có sự khác biệt hiệu suất giữa hai? Có bất cứ điều gì tôi đang thiếu, bạn có thể vui lòng chỉ cho tôi bất kỳ tài liệu tham khảo nào nói nhiều hơn về sự khác biệt hiệu suất.
Vishrant

247
replaceAll("\\s","")

\w = Bất cứ điều gì là một nhân vật từ

\W = Bất cứ điều gì không phải là một ký tự từ (bao gồm cả dấu chấm câu, v.v.)

\s = Bất cứ thứ gì là ký tự khoảng trắng (bao gồm dấu cách, ký tự tab, v.v.)

\S = Bất cứ điều gì không phải là ký tự khoảng trắng (bao gồm cả chữ và số, cũng như dấu chấm câu, v.v.)

(Chỉnh sửa: Như đã chỉ ra, bạn cần thoát dấu gạch chéo ngược nếu muốn \stiếp cận công cụ regex, dẫn đến \\s.)


103

Câu trả lời đúng nhất cho câu hỏi là:

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

Tôi chỉ điều chỉnh mã này từ các câu trả lời khác. Tôi đang đăng nó bởi vì ngoài chính xác những gì câu hỏi yêu cầu, nó còn chứng minh rằng kết quả được trả về dưới dạng một chuỗi mới, chuỗi gốc không được sửa đổi như một số loại câu trả lời.

(Các nhà phát triển Java có kinh nghiệm có thể nói "tất nhiên, bạn thực sự không thể sửa đổi Chuỗi", nhưng đối tượng mục tiêu cho câu hỏi này có thể không biết điều này.)


Điều này có nghĩa là chúng ta có thể ghi đè chuỗi gốc bằng cách viết ví dụ: S = S.replaceAll ("\\ s", ""); trong khi đó, việc thay thế sẽ được thực hiện và sau đó S sẽ nhận được phiên bản đặc trưng của S
frogeyedpeas

@frogeyedpeas Điều đó ghi đè lên biến Snhưng nó không ghi đè lên chuỗi Strỏ tới.
Phục hồi Monica

Cứu ngày của tôi! ;)
Paras Jain


45

Một cách để xử lý các thao tác Chuỗi là StringUtils từ Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Bạn có thể tìm thấy nó ở đây . commons-lang bao gồm nhiều hơn nữa và được hỗ trợ tốt.


Điều này có lợi thế là dễ đọc hơn.
payne

36

Nếu bạn cũng cần xóa các khoảng trắng không thể phá vỡ, bạn có thể nâng cấp mã của mình như thế này:

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

Điều này không thành công cho: " ab c "
Mohd Farid

1
@MohdFarid Áp dụng một sửa chữa, bây giờ phải ổn.
Denis Kulagin

Tôi nghĩ rằng nó phải là st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk

30

Nếu bạn thích các lớp tiện ích hơn regexes, có một phương thức trim ALLWhitespace (String) trong StringUtils trong Spring Framework.


13
Ý tưởng thay thế được chào đón. Họ sẽ giúp một số người, ngay cả khi không phải tất cả mọi người.
james.garriss

25

Bạn đã có câu trả lời chính xác từ Gursel Koca nhưng tôi tin rằng rất có thể đây không phải là điều bạn thực sự muốn làm. Thay vào đó, phân tích cú pháp các giá trị khóa?

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]);
    }
  }
}

đầu ra:
name = john
age = 13
năm = 2001


22

Bạn nên sử dụng

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

thay vì:

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

Bằng cách này, nó sẽ hoạt động với nhiều hơn một khoảng trắng giữa mỗi chuỗi. Dấu + trong biểu thức chính trên có nghĩa là "một hoặc nhiều \ s"


2
Tôi đã gõ một ví dụ nhanh để kiểm tra điều này bởi vì nó nghe có vẻ kỳ lạ đối với tôi và thấy rằng dấu cộng được thêm vào là không cần thiết. Nhiều không gian phân cách các từ được tiêu thụ. Lý do cho điều này rất có thể là replaceAlllặp lại cho đến khi mẫu không khớp với bất kỳ phần nào của chuỗi.
nyaray

2
Thật. Điều +này có thể làm cho nó thân thiện với CPU hơn một chút, bởi vì khoảng trắng liên tiếp được xử lý trong một hoạt động thay thế duy nhất, nhưng đó là sự khác biệt duy nhất trong trường hợp này. Đó thực sự là All, không phải +là thay thế khoảng trắng không liên tiếp trong chuỗi.
nitro2k01

nó không xóa cái này (u00A0)
Kerim FIRAT

8

Cách dễ nhất để làm điều này là bằng cách sử dụng org.apache.commons.lang3.StringUtilslớp commons-lang3thư viện chẳng hạn như " commons-lang3-3.1.jar" chẳng hạn.

Sử dụng phương thức tĩnh " StringUtils.deleteWhitespace(String str)" trên chuỗi đầu vào của bạn và nó sẽ trả về cho bạn một chuỗi sau khi xóa tất cả các khoảng trắng khỏi nó. Tôi đã thử chuỗi ví dụ của bạn " name=john age=13 year=2001" và nó trả về cho tôi chính xác chuỗi mà bạn muốn - " name=johnage=13year=2001". Hi vọng điêu nay co ich.


7

Bạn có thể làm điều đó đơn giản bằng cách

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

Thật đáng ngạc nhiên, công nhân duy nhất trong tình huống của tôi. Cảm ơn.
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("  "," ");

// nó hoạt động tốt với mọi khoảng trắng * đừng quên khoảng trống trong sting b


Rất hữu ích, nhưng không trả lời câu hỏi được đăng!
BuvinJ

3

\Wcó nghĩa là "ký tự không từ". Mẫu cho các ký tự khoảng trắng là \s. Điều này cũng được ghi lại trong Mẫu javadoc .


8
Phần còn lại của câu trả lời này ở đâu?
LS

3

Trong java chúng ta có thể thực hiện thao tác sau:

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);

để làm điều này, bạn cần nhập các gói sau vào chương trình của mình:

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

Tôi hy vọng nó sẽ giúp bạn.


Thông tin này đã được cung cấp bởi những người khác nhiều năm trước khi bạn đăng câu trả lời của mình.
jan groth

3

Sử dụng Pattern And Matcher, nó năng động hơn.

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

Sử dụng lớp apache chuỗi sử dụng là tốt hơn để tránh NullPulumException

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

Đầu ra

abcdef

3

Khi sử dụng st.replaceAll("\\s+","")trong Kotlin , hãy đảm bảo bạn bọc "\\s+"bằng Regex :

"myString".replace(Regex("\\s+"), "")

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

Thứ nhất với không gian, thứ hai không có không gian.

Thế là xong.


7
Chỉ cần làm rõ, khoảng trắng có nghĩa là [ \t\n\x0B\f\r]. Bạn chỉ đang làm [ ]không gian bình thường .
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

Để xóa khoảng trắng trong ví dụ của bạn, đây là một cách khác để làm điều đó:

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

Điều này làm là nó chuyển đổi nó thành một mảng với các khoảng trắng là dấu phân cách, và sau đó nó kết hợp các mục trong mảng lại với nhau mà không có khoảng trắng.

Nó hoạt động khá tốt và dễ hiểu.


2
Nhưng một giải pháp rất không hiệu quả. Và, như bạn có thể thấy từ các giải pháp khác - cách này chỉ hoạt động cho không gian "" - chứ không phải cho các loại khoảng trắng khác nhau.
GhostCat

1

Có những char không gian khác cũng tồn tại trong các chuỗi .. Vì vậy, char không gian chúng ta có thể cần phải thay thế từ các chuỗi.

Vd: KHÔNG GIAN KHÔNG-BREAK, KHÔNG GIAN BA-PER-EM, KHÔNG GIAN PUNCTUATION

Dưới đây là danh sách không gian char http://jkorpela.fi/chars/spaces.html

Vì vậy, chúng ta cần sửa đổi

\ u2004 chúng tôi cho KHÔNG GIAN BA-PER-EM

s.replace ALL ("[\ u0020 \ u2004]", "")


0

Khoảng trắng có thể loại bỏ bằng cách sử dụng hàm isWhitespace từ Lớp nhân vật.

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

Tách từng nhóm văn bản thành chuỗi con riêng của nó và sau đó nối các chuỗi con đó:

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;
}

Điều này có thể giúp.


0

Bạn cũng có thể xem mã Java bên dưới. Các mã sau không sử dụng bất kỳ phương pháp "tích hợp" nào.

/**
 * 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));

    }
}

Đầu vào:

String inp = "01239Debashish123Pattn456aik";

Đầu ra:

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

Khá nhiều câu trả lời được cung cấp. Tôi muốn đưa ra một giải pháp khá dễ đọc và tốt hơn 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();

    }

}
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.