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

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

" hello     there   "

变成了这样的东西

"hello there"

在这里我用一个空格替换了所有这些多个空格,除了我还希望字符串开头的一个或多个空格消失。

像这样的事情能让我在一定程度上做到

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

但事实并非如此。

453070 次浏览

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

看到String.replaceAll

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

然后使用String.trim

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

试试这个:

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

另请参阅

  • String.trim()

    没有trim()正则表达式

    只用一个replaceAll也可以做到这一点,但这比trim()解决方案可读性差得多。尽管如此,这里提供它只是为了展示regex可以做什么:

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

    有三名候补:

    • ^_+:字符串开头的任意空格序列
      • 匹配并替换为$1,它捕获空字符串
      • 李< / ul > < / >
      • _+$:字符串结尾的任意空格序列
        • 匹配并替换为$1,它捕获空字符串
        • 李< / ul > < / >
        • (_)+:不匹配上述任何一个空格序列,意味着它在中间
          • 匹配并替换为$1,它捕获单个空格
          • 李< / ul > < / >

          另请参阅

这对我很有效

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

其中filter跟在function后面,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();
}

你只需要:

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

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

要快速测试,请尝试:

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

它会返回:

"hello there"
String str = " hello world"

首先减少空间

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

第一个字母大写,其他字母小写

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

你也可以使用环视。

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("^ +| +$| (?= )", "")
);
}
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函数。

使用Apache commons StringUtils.normalizeSpace(String str)方法。看到这里的文档

请使用以下代码

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

检查下这个吗……

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+", "")));


}

如果字符串只包含单个空格,则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;
}

__abc .quote("?")返回文字模式字符串。

这对我来说是完美的:sValue = sValue.trim().replaceAll("\\s+", " ");

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

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

试试这个。

示例代码

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

输出

hello there

首先,它将所有空格替换为单个空格。那么我们必须做修整String,因为String的开始和String的结束,如果StringString的开始和String的结束有空格,它将用单个空格替换所有空格,所以我们需要修整它们。然后你得到你想要的String

"[ ]{2,}"

这将匹配多个空格。

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

输出:

hello there

削减()

只移除前导&尾随的空格。

From Java Doc, 返回值为该字符串的字符串,删除前导和后面的空格

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

“D v Dum my”;

替换(),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

你应该这样做

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

把+放在圆括号内。

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

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

你好,抱歉耽误了! 下面是您正在寻找的最佳和最有效的答案:

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

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

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

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


欲了解更多信息,请参阅相应的文档:

我知道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;
}
到目前为止,已经提供了很多正确答案,我看到很多赞。然而,上面提到的方法可以工作,但不是真正优化或不是真正可读的。 我最近遇到了每个开发人员都会喜欢的解决方案
String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

你完了。 这是一个可读的解。< / p >

在Kotlin中是这样的

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

可以使用字符串标记器

 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());
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');




// Output: "Hello World"

trim()方法删除开头和结尾空格,并使用replaceAll("regex", "字符串来替换")方法与regex" \s+"匹配多个空格,并将其替换为单个空格

myText = myText.trim().replaceAll("\\s+"," ");

这是删除字符串中任何空白的最简单方法。

 public String removeWhiteSpaces(String returnString){
returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
return returnString;
}
String blogName = "how to   do    in  java   .         com";
 

String nameWithProperSpacing = blogName.replaceAll("\\\s+", " ");

string.replaceAll(“\ s +“,““);

如果你已经在你的项目中使用了Guava(19+节),你可能想要使用这个:

CharMatcher.whitespace().trimAndCollapseFrom(input, ' ');

或者,如果你需要删除空格符号( U+0020,参见更多的空白)使用:

CharMatcher.anyOf(" ").trimAndCollapseFrom(input, ' ');