Java cómo reemplazar 2 o más espacios con un solo espacio en cadena y eliminar espacios iniciales y finales

Buscando una manera rápida y simple en Java para cambiar esta cadena

" hello there " 

a algo que se parece a esto

 "hello there" 

donde reemplazo todos esos espacios múltiples con un solo espacio, excepto que también quiero que el uno o más espacios al principio de la cadena desaparezcan.

Algo como esto me atrapa en parte

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

pero no del todo.

Prueba esto:

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

Ver también

  • String.trim()
    • Devuelve una copia de la cadena, con el espacio en blanco inicial y final omitido.
  • regular-expressions.info/Repetition

Sin trim() regex

También es posible hacer esto con solo un replaceAll , pero esto es mucho menos legible que la solución trim() . No obstante, se proporciona aquí solo para mostrar lo que la expresión regular puede hacer:

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

Hay 3 alternativas:

  • ^_+ : cualquier secuencia de espacios al comienzo de la cadena
    • Empareja y reemplaza con $1 , que captura la cadena vacía
  • _+$ : cualquier secuencia de espacios al final de la cadena
    • Empareja y reemplaza con $1 , que captura la cadena vacía
  • (_)+ : cualquier secuencia de espacios que no concuerde con ninguno de los anteriores, lo que significa que está en el medio
    • Empareja y reemplaza con $1 , que captura un solo espacio

Ver también

  • regular-expressions.info/Anchors

Solo necesitas un:

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

donde unirás uno o más espacios y los reemplazarás con un espacio único y luego recortarás los espacios en blanco al principio y al final (podrías invertir primero recortando y luego haciendo coincidir para hacer que la expresión regular sea más rápida como alguien señaló).

Para probar esto rápidamente, intente:

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

y volverá:

 "hello there" 

Utilice el método Apache commons StringUtils.normalizeSpace(String str) . Ver documentos aquí

Para eliminar espacios al principio y al final de la cadena, use String#trim() método String#trim() . Y luego use mytext.replaceAll("( )+", " ") .

Esto funcionó perfectamente para mí: sValue = sValue.trim().replaceAll("\\s+", " ");

Primero puede usar String.trim() y luego aplicar el comando regex replace en el resultado.

Prueba este.

Código de muestra

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

SALIDA

 hello there 

Primero reemplazará todos los espacios con espacio simple. De lo que se supone que tenemos que cortar String porque el Inicio de la String y el Final de la String reemplazará todo el espacio con espacio simple si String tiene espacios al Comienzo de la String y Fin de la String Entonces necesitamos recortarlos. Que obtienes tu String deseada.

 "[ ]{2,}" 

Esto coincidirá con más de un espacio.

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

SALIDA:

 hello there 

También puedes usar lookarounds.

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

O

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

(?= ) coincide con un carácter de espacio que es seguido por otro carácter de espacio. Por lo tanto, en espacios consecutivos, coincidiría con todos los espacios excepto el último porque no está seguido por un carácter de espacio. Esto le deja un espacio único para espacios consecutivos después de la operación de eliminación.

Ejemplo:

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

reducir espacios primero

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

mayúscula la primera letra y minúscula todo lo demás

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

Esto funcionó para mí

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

donde el filtro está siguiendo la función y el escaneo es la cadena de entrada:

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

Ver String.replaceAll .

Use la expresión regular "\s" y reemplace con " " .

Luego usa String.trim .

Mira esto…

 public static void main(String[] args) { String s = "ABCDEFG\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+", ""))); } 

Si String contiene solo un espacio, then replace () no lo reemplazará,

Si los espacios son más de uno, entonces la acción replace () realiza y elimina el spacess.

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

Para contar la cantidad de espacios en una cadena.

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

Patrón .quote (“?”) Devuelve el patrón literal Cadena.

Mi método antes de encontrar la segunda respuesta usando regex como una mejor solución. Tal vez alguien necesita este código.

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

recortar()

Elimina solo los espacios iniciales y finales.

Desde Java Doc, “Devuelve una cadena cuyo valor es esta cadena, con cualquier espacio en blanco inicial y final eliminado”.

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

“D ev Dum my”

replace (), replaceAll ()

Reemplaza todas las cadenas vacías en la palabra,

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

Salida:

 "DevDummy" "DevDummy" "DevDummy" 

Nota: “\ s +” es la expresión regular similar al carácter de espacio vacío.

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

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

La solución anterior es el algoritmo con la complejidad de O (n) sin usar ninguna función java.

Por favor usa el código a continuación

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