在Java中从字符串中删除空格


684

我有一个像这样的字符串:

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

我想删除字符串中的空格。我试过了,trim()但这只删除了整个字符串前后的空格。我也尝试过,replaceAll("\\W", "")但后来=也被删除了。

如何使用以下方法实现字符串:

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


75
您对“ name = johnage = 13year = 2001”字符串的计划是什么?我希望不要解析它。
乔纳斯·艾夫斯特伦2011年

4
@JonasElfström我想它可以帮助进行字符串比较
Isaac

如果字符串实际上是“”呢?就像我提到的那样,trims()所做的所有操作都是清除空字符串吗?@zyamat吗?
gumuruh

Answers:


1286

st.replaceAll("\\s+","")删除所有空格和不可见字符(例如,tab,\n)。


st.replaceAll("\\s+","")st.replaceAll("\\s","")产生相同的结果。

第二个正则表达式比第一个正则表达式快20%,但是随着连续空格数量的增加,第一个正则表达式的性能要优于第二个正则表达式。


将值分配给变量(如果不直接使用):

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

34
我想指出的是,如果您要用单个空格(或某些其他字符集)替换所有空格,则这两个正则表达式将产生不同的结果。如果您有连续的空格,请使用\\ s将每个空格字符替换为所提供的给定字符。给定\\ s +,它将用单个替换字符串替换每组空白。我看到很多情况下,人们可能会来这篇文章,以用不仅仅是空字符串的东西替换空白,这可能会有所帮助。
凯特琳

2
但是如果它在字符串的开头,它不会删除空格。
寂寞的

@lonesome为此使用.trim()
CQM

6
只需使用apache-commons中的StringUtils。它是一个称为StringUtils.deleteWhitespace的静态方法。
Crozeta

@Gursel感谢两个正则表达式的答案和性能比较。我想知道为什么两者之间存在性能差异?有什么我想念的吗,请您指出任何有关性能差异的参考资料。
Vishrant

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

\w =任何文字字符

\W =任何非文字字符(包括标点符号等)

\s =空格字符(包括空格,制表符等)

\S =任何非空格字符(包括字母和数字,以及标点符号等)

(编辑:如前所述,如果要\s访问regex引擎,则需要转义反斜杠,结果为\\s。)


103

该问题的最正确答案是:

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

我只是从其他答案中改编了这段代码。我发布它的原因是,除了确切地是问题所要求的内容之外,它还证明了结果以新字符串的形式返回,原始字符串并未像某些答案所暗示的那样被修改

(经验丰富的Java开发人员可能会说“当然,您实际上不能修改String”,但是此问题的目标读者很可能不知道这一点。)


这是否意味着我们可以通过编写以下示例来覆盖原始字符串:S = S.replaceAll(“ \\ s”,“”); 而首先将完成替换,然后S将收到S的字符
剥离

@frogeyedpeas会覆盖变量,S不会覆盖S指向的字符串。
恢复莫妮卡

拯救了我的一天!;)
Paras Jain


45

处理字符串操作的一种方法是来自Apache commons的StringUtils。

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

你可以在这里找到它。commons-lang包含更多内容,并且得到了很好的支持。


这具有更易读的优点。
payne

36

如果您还需要删除牢不可破的空间,则可以这样升级代码:

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

此操作失败: " ab c "
Mohd Farid

1
@MohdFarid应用了一个修复程序,现在必须确定。
Denis Kulagin

我认为应该是st.replaceAll(“ [\\ s | \ u00A0] +”,“”);
paramupk


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

输出:
名称=约翰
年龄= 13
岁= 2001


22

你应该用

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

代替:

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

这样,它将在每个字符串之间使用多个空格。上述正则表达式中的+号表示“一个或多个\ 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”。希望这可以帮助。



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

在Java中,我们可以执行以下操作:

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 2014年

3

使用Pattern And Matcher,它更加动态。

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字符串util类最好避免NullPointerException

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

输出量

abcdef


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

首先有空间,其次没有空间。

然后就完成了。


7
为了澄清起见,空格表示[ \t\n\x0B\f\r]。您只在做普通的[ ]空间。
GKFX'2

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

字符串中也存在其他空格字符。因此,我们可能需要从字符串中替换空格字符。

例:无间断空间,3个电磁区,标点空间

这是空格char的列表http://jkorpela.fi/chars/spaces.html

所以我们需要修改

\ u2004我们用于三个PER-EM空间

s.replaceAll(“ [\ u0020 \ u2004]”,“”)


0

可以使用Character Class中的isWhitespace函数删除空格。

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

    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.