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

Nes*_*ssa 249 java regex string replace

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

" hello     there   "
Run Code Online (Sandbox Code Playgroud)

看起来像这样的东西

"hello there"
Run Code Online (Sandbox Code Playgroud)

我用一个空格替换所有这些多个空格,除了我还希望字符串开头的一个或多个空格不见了.

像这样的东西让我部分在那里

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");
Run Code Online (Sandbox Code Playgroud)

但不完全.

pol*_*nts 428

试试这个:

String after = before.trim().replaceAll(" +", " ");
Run Code Online (Sandbox Code Playgroud)

也可以看看


没有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")
        );
    }
Run Code Online (Sandbox Code Playgroud)

有3个替代品:

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

也可以看看

  • +1,特别是因为值得注意的是,使用`trim()`然后`replaceAll()`使用的内存少于执行相反的操作.不是很多,但是如果它被多次调用,它可能会加起来,特别是如果有很多"可修剪的空白".(`Trim()`并没有真正摆脱额外的空间 - 它只是通过移动起始值和结束值来隐藏它.底层的`char []`保持不变.) (9认同)
  • 很好的正则表达式.注意:用`\\ s`替换空格``将用所需的字符替换任何一组空格. (5认同)
  • 正如 Lee Meador 提到的,```.trim().replaceAll(" +", " ")```(有两个空格)比 ```.trim().replaceAll(" +", " ") 快```(一个空格)。我对只有单个空格和所有双空格的字符串进行了计时测试,并且在执行*大量*操作(数百万或更多,取决于环境)时,两者的速度都大大加快。 (3认同)
  • 这只是一个细节,但我认为`()+`或`(){2,}`应该是(非常)效率更高;) (2认同)

sar*_*son 143

你只需要一个:

replaceAll("\\s{2,}", " ").trim();
Run Code Online (Sandbox Code Playgroud)

在哪里匹配一个或多个空格并用一个空格替换它们然后在开头和结尾修剪空格(实际上可以通过首先修剪然后匹配来反转以使正则表达式更快,就像有人指出的那样).

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

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

它将返回:

"hello there"
Run Code Online (Sandbox Code Playgroud)

  • @ sarah.ferguson请删除第一个替换中不应存在的最后一个括号")".谢谢. - 系统不允许我这样做!(不少于6个字符有资格进行编辑..) (3认同)
  • 我可能会先修剪,因为那样你就可以节省正则表达式了. (2认同)
  • 请注意,在没有多个空格的情况下,这确实会将一个空格替换为另一个空格.在这种情况下,您可能不需要进行替换,因为您也要用一个空格替换一个选项卡.仅识别多个空格会很好. (2认同)
  • @geowar这个问题在哪里问了标签对不起?我确信上面的内容并没有取代☮符号..而且neither ... (2认同)
  • 等一下@geowar这确实用空格替换了一个表.我刚尝试过 (2认同)

Mon*_*ois 40

使用Apache commons StringUtils.normalizeSpace(String str)方法.请参阅此处的文档


Doc*_*tor 18

这对我很有用: sValue = sValue.trim().replaceAll("\\s+", " ");

  • 已编辑,因为您的原始答案删除了所有空格,而这不是 OP 所要求的 (3认同)

xcu*_*pir 17

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

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);
Run Code Online (Sandbox Code Playgroud)

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

请注意,任何不可打印的字符,包括空格、制表符和换行符都将被压缩或删除


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


k s*_*ath 14

trim() 方法删除前导和尾随空格,并使用 replaceAll("regex", "string to replace") 方法与正则表达式 "\s+" 匹配多个空格并将其替换为单个空格

myText = myText.trim().replaceAll("\\s+"," ");
Run Code Online (Sandbox Code Playgroud)


fol*_*one 13

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


Eya*_*der 12

您可以先使用String.trim(),然后对结果应用regex replace命令.

  • trim()将删除字符串开头和结尾的所有空格,它不适用于单词之间的空格 (9认同)

Git*_*lal 12

"[ ]{2,}"
Run Code Online (Sandbox Code Playgroud)

这将匹配多个空间.

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

OUTPUT:

hello there
Run Code Online (Sandbox Code Playgroud)


小智 9

试试这个吧.

示例代码

String str = " hello     there   ";
System.out.println(str.replaceAll("( +)"," ").trim());
Run Code Online (Sandbox Code Playgroud)

OUTPUT

hello there
Run Code Online (Sandbox Code Playgroud)

首先,它将用单个空间替换所有空间.比我们必须做修剪String因为它的开始String和结束String将用单个空格替换所有空间如果String在开始String和结束时有空格String我们需要修剪它们.比你得到你想要的String.


小智 7

String blogName = "how to   do    in  java   .         com"; 
 
String nameWithProperSpacing = blogName.replaceAll("\\\s+", " ");
Run Code Online (Sandbox Code Playgroud)


Sam*_*son 5

修剪()

仅删除前导和尾随空格。

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

System.out.println(" D ev  Dum my ".trim());
Run Code Online (Sandbox Code Playgroud)

“ 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+",""));
Run Code Online (Sandbox Code Playgroud)

输出:

"DevDummy"

"DevDummy"

"DevDummy"
Run Code Online (Sandbox Code Playgroud)

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

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


Kun*_*hra 5

到目前为止提供了很多正确的答案,我看到很多赞成。但是,上述方法可以工作,但没有真正优化或不可读。我最近遇到了每个开发人员都会喜欢的解决方案。

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );
Run Code Online (Sandbox Code Playgroud)

你完成了。这是可读的解决方案。


Raf*_*ael 5

在 Kotlin 中它看起来像这样

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