Java how to replace 2 or more spaces with single space in string and delete leading and trailing spaces

JavaRegexStringReplace

Java Problem Overview


Looking for quick, simple way in Java to change this string

" hello     there   "

to something that looks like this

"hello there"

where I replace all those multiple spaces with a single space, except I also want the one or more spaces at the beginning of string to be gone.

Something like this gets me partly there

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

but not quite.

Java Solutions


Solution 1 - Java

Try this:

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

No trim() regex

It's also possible to do this with just one replaceAll, but this is much less readable than the trim() solution. Nonetheless, it's provided here just to show what regex can do:

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

There are 3 alternates:

  • ^_+ : any sequence of spaces at the beginning of the string
    • Match and replace with $1, which captures the empty string
  • _+$ : any sequence of spaces at the end of the string
    • Match and replace with $1, which captures the empty string
  • (_)+ : any sequence of spaces that matches none of the above, meaning it's in the middle
    • Match and replace with $1, which captures a single space
See also

Solution 2 - Java

You just need a:

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

where you match one or more spaces and replace them with a single space and then trim whitespaces at the beginning and end (you could actually invert by first trimming and then matching to make the regex quicker as someone pointed out).

To test this out quickly try:

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

and it will return:

"hello there"

Solution 3 - Java

Use the Apache commons StringUtils.normalizeSpace(String str) method. See docs here

Solution 4 - Java

This worked perfectly for me : sValue = sValue.trim().replaceAll("\\s+", " ");

Solution 5 - Java

The following code will compact any whitespace between words and remove any at the string's beginning and end

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

This will output a string with many spaces, a tab and a newline

Note that any non-printable characters including spaces, tabs and newlines will be compacted or removed


For more information see the respective documentation:

  • [String#trim() method][1]
  • [String#replaceAll(String regex, String replacement) method][2]
  • For information about Java's regular expression implementation see the [documentation of the Pattern class][3]

[1]: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#trim-- "JavaDoc page of String#trim" [2]: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String- "JavaDoc page of String#replaceAll" [3]: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html "JavaDoc page of Pattern"

Solution 6 - Java

"[ ]{2,}"

This will match more than one space.

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

OUTPUT:

hello there

Solution 7 - Java

trim() method removes the leading and trailing spaces and using replaceAll("regex", "string to replace") method with regex "\s+" matches more than one space and will replace it with a single space

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

Solution 8 - Java

To eliminate spaces at the beginning and at the end of the String, use String#trim() method. And then use your mytext.replaceAll("( )+", " ").

Solution 9 - Java

You can first use String.trim(), and then apply the regex replace command on the result.

Solution 10 - Java

Try this one.

Sample Code

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

OUTPUT

hello there

First it will replace all the spaces with single space. Than we have to supposed to do trim String because Starting of the String and End of the String it will replace the all space with single space if String has spaces at Starting of the String and End of the String So we need to trim them. Than you get your desired String.

Solution 11 - Java

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

Solution 12 - Java

trim()

Removes only the leading & trailing spaces.

From Java Doc, "Returns a string whose value is this string, with any leading and trailing whitespace removed."

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

"D ev Dum my"

replace(), replaceAll()

Replaces all the empty strings in the word,

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

Output:

"DevDummy"

"DevDummy"

"DevDummy"

Note: "\s+" is the regular expression similar to the empty space character.

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

Solution 13 - Java

A lot of correct answers been provided so far and I see lot of upvotes. However, the mentioned ways will work but not really optimized or not really readable. I recently came across the solution which every developer will like.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

You are done. This is readable solution.

Solution 14 - Java

In Kotlin it would look like this

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

Solution 15 - Java

You could use lookarounds also.

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

OR

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

<space>(?= ) matches a space character which is followed by another space character. So in consecutive spaces, it would match all the spaces except the last because it isn't followed by a space character. This leaving you a single space for consecutive spaces after the removal operation.

Example:

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

Solution 16 - Java

String str = " hello world"

reduce spaces first

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

capitalize the first letter and lowercase everything else

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

Solution 17 - Java

you should do it like this

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

put + inside round brackets.

Solution 18 - Java

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

Solution 19 - Java

See String.replaceAll.

Use the regex "\s" and replace with " ".

Then use String.trim.

Solution 20 - Java

This worked for me

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

where filter is following function and scan is the input string:

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

Solution 21 - Java

The simplest method for removing white space anywhere in the string.

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

Solution 22 - Java

check this...

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

If String contains only single-space then replace() will not-replace,

If spaces are more than one, Then replace() action performs and removes spacess.

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

To count the number of spaces in a String.

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

Pattern.quote("?") returns literal pattern String.

Solution 23 - Java

My method before I found the second answer using regex as a better solution. Maybe someone needs this code.

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

Solution 24 - Java

Stream version, filters spaces and tabs.

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

Solution 25 - Java

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


// Output: "Hello World"

Solution 26 - Java

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

Solution 27 - Java

If you already use Guava (v. 19+) in your project you may want to use this:

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

or, if you need to remove exactly SPACE symbol ( or U+0020, see more whitespaces) use:

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

Solution 28 - Java

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

The above solution is the algorithm with the complexity of O(n) without using any java function.

Solution 29 - Java

Please use below code

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

Solution 30 - Java

Hello sorry for the delay! Here is the best and the most efficiency answer that you are looking for:

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

So your output of this example will be: My name is kingkon.

However this method will remove also the "\n" that your string may has. So if you do not want that just use this simple method:

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

And if you want to strip the leading and trailing spaces too just add:

str = str.trim();

Solution 31 - Java

I know replaceAll method is much easier but I wanted to post this as well.

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

Solution 32 - Java

> String Tokenizer can be used

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNessaView Question on Stackoverflow
Solution 1 - JavapolygenelubricantsView Answer on Stackoverflow
Solution 2 - Javasarah.fergusonView Answer on Stackoverflow
Solution 3 - JavaMonica GranboisView Answer on Stackoverflow
Solution 4 - JavaDoctorView Answer on Stackoverflow
Solution 5 - Javamichael-slxView Answer on Stackoverflow
Solution 6 - JavaGitesh DalalView Answer on Stackoverflow
Solution 7 - Javak sarathView Answer on Stackoverflow
Solution 8 - JavaGeorgeView Answer on Stackoverflow
Solution 9 - JavaEyal SchneiderView Answer on Stackoverflow
Solution 10 - JavaRaj S. RusiaView Answer on Stackoverflow
Solution 11 - JavaNarekView Answer on Stackoverflow
Solution 12 - JavaSameeraView Answer on Stackoverflow
Solution 13 - JavaKunal VohraView Answer on Stackoverflow
Solution 14 - JavaRafaelView Answer on Stackoverflow
Solution 15 - JavaAvinash RajView Answer on Stackoverflow
Solution 16 - JavaKhaledMohamedPView Answer on Stackoverflow
Solution 17 - JavaKirellos Malak HabibView Answer on Stackoverflow
Solution 18 - JavaAjinkya_MView Answer on Stackoverflow
Solution 19 - JavaZakView Answer on Stackoverflow
Solution 20 - JavaMr_HmpView Answer on Stackoverflow
Solution 21 - JavaSandun SusanthaView Answer on Stackoverflow
Solution 22 - JavaYashView Answer on Stackoverflow
Solution 23 - Javatrinity420View Answer on Stackoverflow
Solution 24 - JavaAris2WorldView Answer on Stackoverflow
Solution 25 - JavaalaswerView Answer on Stackoverflow
Solution 26 - JavaAmod KunwarView Answer on Stackoverflow
Solution 27 - JavaaeracodeView Answer on Stackoverflow
Solution 28 - JavadevmohdView Answer on Stackoverflow
Solution 29 - JavaPiyushView Answer on Stackoverflow
Solution 30 - Javakostas poimenidhsView Answer on Stackoverflow
Solution 31 - JavaesranurView Answer on Stackoverflow
Solution 32 - JavaSwaranView Answer on Stackoverflow