Java如何用字符串中的单个空格替换2个或更多空格并删除前导和尾随空格


271

在Java中寻找快速,简单的方法来更改此字符串

" hello     there   "

看起来像这样

"hello there"

在这里我将所有多个空格替换为一个空格,但我也希望字符串开头的一个或多个空格消失。

这样的事情让我部分地在那里

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

但不完全是


5
您应该考虑接受答案。这样,以后到达页面的人们就可以轻松选择确定的解决方案。
保罗·鲁尼

1
这是最推荐的方法之一。=>。字符串nameWithProperSpacing = StringUtils.normalizeSpace(stringWithLotOfSpaces);
Kunal Vohra

s = s.replaceAll(“ \\ s +”,“”);
Saroj Kumar Sahoo

Answers:


460

试试这个:

String after = before.trim().replaceAll(" +", " ");

也可以看看


没有trim()正则表达式

也可以只用一个执行此操作replaceAll,但这比trim()解决方案的可读性差得多。尽管如此,这里提供它只是为了显示正则表达式可以做什么:

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

有3个备用项:

  • ^_+ :字符串开头的任意空格序列
    • 匹配并替换为$1,以捕获空字符串
  • _+$ :字符串末尾的任意空格序列
    • 匹配并替换为$1,以捕获空字符串
  • (_)+ :任何与以上都不匹配的空格序列,表示它位于中间
    • 匹配并替换为$1,以捕获单个空格

也可以看看


11
+1,尤其是值得一提的是,trim()replaceAll()其他方法相比,这样做所占用的内存更少。不是很多,但是如果多次调用它,它可能会加起来,尤其是在有很多“可修剪空白”的情况下。(Trim()实际上并没有消除多余的空间,它只是通过移动开始值和结束值来隐藏它。底层char[]保持不变。)
corsiKa,2010年

2
这只是一个细节,但我认为( ) +( ){2,}应该(稍微)更有效率;)
sp00m

6
好的正则表达式。注意:将空格`替换为\\s将会用所需字符替换任何一组空格。
djmj

1
请注意,()+部分将匹配单个空格,并将其替换为单个空格。也许(<space> <space> +)会更好,因此它只有在存在多个空格时才匹配,并且替换将对字符串进行净更改。
Lee Meador

2
正如Lee Meador所说,.trim().replaceAll(" +", " ")(两个空格)比.trim().replaceAll(" +", " ")(一个空格)要快。我对只有一个空格和所有双倍空格的字符串进行了时序测试,并且在执行大量操作(数百万个或更多,取决于环境)时,它的速度都大大提高了。
加里·韦弗

154

您只需要一个:

replaceAll("\\s{2,}", " ").trim();

在这里,您可以匹配一个或多个空格,并用一个空格替换它们,然后在开头和结尾处修剪空白(实际上,您可以先修剪然后再进行匹配,从而使正则表达式更快地转化,就像有人指出的那样)。

要快速测试一下,请尝试:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

它将返回:

"hello there"

3
我可能会先修剪一下,因为那样您会节省一些正则表达式的工作。
迈克尔

3
@ sarah.ferguson请删除第一个replaceAll中不应该包含的最后一个括号“)”。谢谢。-系统不允许我这样做!(不得少于6个字符。)
mwarren '16

2
请注意,在没有多个空格的情况下,确实会将一个空格替换为另一个空格。在这种情况下,无需进行替换,尽管您可能需要替换,因为您也要用单个空格替换一个选项卡。只识别多个空格会很好。
Lee Meador

2
@geowar这个问题在哪里问标签?我确定以上内容也不会取代☮符号,也不会取代✌...
sarah.ferguson

2
等待第二个@geowar这确实将一个表替换为一个空格。我刚刚尝试过
user1870400


20

这对我来说非常合适: sValue = sValue.trim().replaceAll("\\s+", " ");


1
人们编辑了我的答案。原始值为:sValue = sValue.replaceAll(“ \ s +”,“”).trim();
医生

2
被编辑因为你原来的答案删除所有的空间,这不是什么OP问
何塞·鲁伊•桑托斯

17
"[ ]{2,}"

这将匹配多个空间。

String mytext = " hello     there   ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);

输出:

hello there

13

要消除String开头和结尾的空格,请使用String#trim()方法。然后使用mytext.replaceAll("( )+", " ")



10

以下代码将压缩单词之间的任何空格,并删除字符串开头和结尾的任何空格

String input = "\n\n\n  a     string with     many    spaces,    \n"+
               " a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);

这将输出 a string with many spaces, a tab and a newline

请注意,所有不可打印的字符(包括空格,制表符和换行符)将被压缩或删除


有关更多信息,请参见相应的文档:


9

试试这个。

样例代码

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());

输出值

hello there

首先,它将用单个空格替换所有空格。比起我们必须进行修剪,String因为如果开始处String和结束处有空格,则开始处和结束处将String用单个空格替换所有空间,因此我们需要进行修剪。比你得到你想要的。StringStringStringString


4

您也可以使用环顾四周。

test.replaceAll("^ +| +$|(?<= ) ", "");

要么

test.replaceAll("^ +| +$| (?= )", "")

<space>(?= )匹配一个空格字符,后跟另一个空格字符。因此,在连续的空格中,它将匹配除最后一个空格以外的所有空格,因为它后面没有空格字符。在删除操作之后,这为连续的空格留了一个空格。

例:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }

按照您的方式,它将与前面或结尾的任何空格或后面的另一个空格匹配。这意味着“ a .... b”将匹配3次并替换3次。遍历replaceAll()方法内部的所有内部空间。也许您可以更改它以一次匹配2个或更多空间的任何序列,并减少内部迭代。
Lee Meador

也许<space> +(?= <space>)可以做到。
Lee Meador

4

修剪()

仅删除前导和尾随空格。

在Java Doc中,“返回值为该字符串的字符串,并删除所有前导和尾随空格。”

System.out.println(" D ev  Dum my ".trim());

“ Dev Dum my”

replace(),replaceAll()

替换单词中的所有空字符串,

System.out.println(" D ev  Dum my ".replace(" ",""));

System.out.println(" D ev  Dum my ".replaceAll(" ",""));

System.out.println(" D ev  Dum my ".replaceAll("\\s+",""));

输出:

"DevDummy"

"DevDummy"

"DevDummy"

注意:“ \ s +”是类似于空白字符的正则表达式。

参考:https : //www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html


4

到目前为止,已经提供了许多正确答案,我看到很多反对意见。但是,上述方法将起作用,但不能真正优化或难以理解。我最近遇到了每个开发人员都会喜欢的解决方案。

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

大功告成 这是可读的解决方案。


3

在科特林,它看起来像这样

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")

2
String str = " hello world"

首先减少空间

str = str.trim().replaceAll(" +", " ");

大写第一个字母并小写其他所有内容

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();

2
mytext = mytext.replaceAll("\\s+"," ");

不鼓励仅使用代码的答案。请单击“ 编辑”并添加一些单词,以概括您的代码如何解决该问题,或者说明您的答案与以前的答案有何不同。谢谢
Nick

1

这对我有用

scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();

其中filter跟随函数,而scan是输入字符串:

public String filter(String scan, String regex, String replace) {
    StringBuffer sb = new StringBuffer();

    Pattern pt = Pattern.compile(regex);
    Matcher m = pt.matcher(scan);

    while (m.find()) {
        m.appendReplacement(sb, replace);
    }

    m.appendTail(sb);

    return sb.toString();
}

1
这将用空格而不是<tab> <tab>替换<space> <tab>。看来这是一个小问题。
Lee Meador

1

你应该这样

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( +)", " ");

将+放在圆括号内。


1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();

0

请参阅String.replaceAll

使用正则表达式"\s"并替换为" "

然后使用String.trim


1
new String(“ hello there”).replaceAll(“ \\ s”,“ +”)返回+ hello +++++++ there +++,因此绝对无法正常使用
。–

1
试试new String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s 2014年

0

检查这个...

public static void main(String[] args) {
    String s = "A B  C   D    E F      G\tH I\rJ\nK\tL";
    System.out.println("Current      : "+s);
    System.out.println("Single Space : "+singleSpace(s));
    System.out.println("Space  count : "+spaceCount(s));
    System.out.format("Replace  all = %s", s.replaceAll("\\s+", ""));

    // Example where it uses the most.
    String s = "My name is yashwanth . M";
    String s2 = "My nameis yashwanth.M";

    System.out.println("Normal  : "+s.equals(s2));
    System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));

} 

如果String仅包含单个空格,则replace()不会替换,

如果空格大于一个,那么replace()操作将执行并删除空格。

public static String singleSpace(String str){
    return str.replaceAll("  +|   +|\t|\r|\n","");
}

计算字符串中的空格数。

public static String spaceCount(String str){
    int i = 0;
    while(str.indexOf(" ") > -1){
      //str = str.replaceFirst(" ", ""+(i++));
        str = str.replaceFirst(Pattern.quote(" "), ""+(i++)); 
    }
    return str;
}

模式 .quote(“?”)返回文字模式字符串。


0

在找到第二个答案之前,我使用正则表达式作为更好的解决方案的方法。也许有人需要此代码。

private String replaceMultipleSpacesFromString(String s){
    if(s.length() == 0 ) return "";

    int timesSpace = 0;
    String res = "";

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if(c == ' '){
            timesSpace++;
            if(timesSpace < 2)
                res += c;
        }else{
            res += c;
            timesSpace = 0;
        }
    }

    return res.trim();
}

有趣,但是空白不仅仅意味着空格。
Laur Ivan

@LaurIvan是什么意思?
trinity420 '16

该条目很好地解释\s了正则表达式(空格,制表符,换行符,换页符)的含义。
Laur Ivan

@LaurIvan您的链接已断开,但您是正确的。我认为,可以通过遍历输入字符串,删除每个非字母,非数字和非空格字符来解决此问题。
trinity420 '16

0

流版本,过滤空格和制表符。

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))

0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"

0

删除字符串中任意位置的空白的最简单方法。

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}

-1
public class RemoveExtraSpacesEfficient {

    public static void main(String[] args) {

        String s = "my    name is    mr    space ";

        char[] charArray = s.toCharArray();

        char prev = s.charAt(0);

        for (int i = 0; i < charArray.length; i++) {
            char cur = charArray[i];
            if (cur == ' ' && prev == ' ') {

            } else {
                System.out.print(cur);
            }
            prev = cur;
        }
    }
}

上述解决方案是算法复杂度为O(n),不使用任何Java函数。


-1

请使用下面的代码

package com.myjava.string;

import java.util.StringTokenizer;

public class MyStrRemoveMultSpaces {

    public static void main(String a[]){

        String str = "String    With Multiple      Spaces";

        StringTokenizer st = new StringTokenizer(str, " ");

        StringBuffer sb = new StringBuffer();

        while(st.hasMoreElements()){
            sb.append(st.nextElement()).append(" ");
        }

        System.out.println(sb.toString().trim());
    }
}

-1

您好,抱歉延迟!这是您正在寻找的最佳和最高效的答案:

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

public class MyPatternReplace {

public String replaceWithPattern(String str,String replace){

    Pattern ptn = Pattern.compile("\\s+");
    Matcher mtch = ptn.matcher(str);
    return mtch.replaceAll(replace);
}

public static void main(String a[]){
    String str = "My    name    is  kingkon.  ";
    MyPatternReplace mpr = new MyPatternReplace();
    System.out.println(mpr.replaceWithPattern(str, " "));
}

因此,此示例的输出将是: 我的名字是kingkon。

但是,此方法还将删除字符串可能具有的“ \ n”。因此,如果您不希望这样做,请使用以下简单方法:

while (str.contains("  ")){  //2 spaces
str = str.replace("  ", " "); //(2 spaces, 1 space) 
}

如果您也想去除前导和尾随空格,只需添加:

str = str.trim();

-1

我知道replaceAll方法要容易得多,但我也想发布此方法。

public static String removeExtraSpace(String input) {
    input= input.trim();
    ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
    for(int i=0; i<x.size()-1;i++) {
        if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) { 
            x.remove(i); 
            i--; 
        }
    }
    String word="";
    for(String each: x) 
        word+=each;
    return word;
}

1
即使此方法可行,但它并不是最简单的解决方案。
platzhersh

-1

可以使用字符串标记器

 String str = "  hello    there  ";
            StringTokenizer stknzr = new StringTokenizer(str, " ");
            StringBuffer sb = new StringBuffer();
            while(stknzr.hasMoreElements())
            {
                sb.append(stknzr.nextElement()).append(" ");
            }
            System.out.println(sb.toString().trim());
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.