Java como replace 2 ou mais espaços com espaço único em string e excluir espaços iniciais e finais

Procurando uma maneira rápida e simples em Java para alterar essa string

" hello there " 

para algo que se parece com isso

 "hello there" 

onde eu substituo todos esses espaços múltiplos por um único espaço, exceto que eu também quero que um ou mais espaços no início da string sejam removidos.

Algo assim me pega em parte

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

mas não completamente.

Tente isto:

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

Veja também

  • String.trim()
    • Retorna uma cópia da string, com espaços em branco iniciais e finais omitidos.
  • regular-expressions.info/Repetition

Nenhum trim() regex

Também é possível fazer isso com apenas uma replaceAll , mas isso é muito menos legível que a solução trim() . No entanto, é fornecido aqui apenas para mostrar o que a regex pode fazer:

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

Existem 3 alternativas:

  • ^_+ : qualquer seqüência de espaços no começo da string
    • Corresponder e replace por $1 , que captura a string vazia
  • _+$ : qualquer seqüência de espaços no final da string
    • Corresponder e replace por $1 , que captura a string vazia
  • (_)+ : qualquer sequência de espaços que não corresponda a nenhuma das opções acima, o que significa que está no meio
    • Combine e substitua por $1 , que captura um único espaço

Veja também

  • regular-expressions.info/Anchors

Você só precisa de um:

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

onde você combina um ou mais espaços e os substitui por um único espaço e então apara os espaços em branco no início e no final (você pode realmente inverter primeiro aparando e depois combinando para tornar o regex mais rápido como alguém apontou).

Para testar isso rapidamente, tente:

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

e ele retornará:

 "hello there" 

Use o método Apache commons StringUtils.normalizeSpace(String str) . Veja os documentos aqui

Para eliminar espaços no início e no final da String, use o método String#trim() . E então use o seu mytext.replaceAll("( )+", " ") .

Isso funcionou perfeitamente para mim: sValue = sValue.trim().replaceAll("\\s+", " ");

Você pode primeiro usar String.trim() e, em seguida, aplicar o comando regex replace no resultado.

Tente este.

Código de amostra

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

SAÍDA

 hello there 

Primeiro, ele replaceá todos os espaços por espaço único. Do que nós temos que fazer o trim String porque Iniciando o String e End of the String ele irá replace todo o espaço com espaço único se String tiver espaços em Starting of the String e End of the String Então nós precisamos cortá-los. Do que você obtém a sua String desejada.

 "[ ]{2,}" 

Isto irá corresponder a mais de um espaço.

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

SAÍDA:

 hello there 

Você poderia usar lookarounds também.

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

OU

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

(?= ) corresponde a um caractere de espaço que é seguido por outro caractere de espaço. Portanto, em espaços consecutivos, ele corresponderia a todos os espaços, exceto o último, porque não é seguido por um caractere de espaço. Isso deixa um espaço único para espaços consecutivos após a operação de remoção.

Exemplo:

  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" 

reduzir espaços primeiro

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

capitalizar a primeira letra e minúsculas tudo o resto

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

Isso funcionou para mim

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

onde filter está seguindo a function e scan é a string de input:

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

Veja String.replaceAll .

Use o regex "\s" e substitua por " " .

Em seguida, use String.trim .

verifique isso …

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

Se String contiver apenas espaço único, então replace () não replaceá,

Se espaços são mais de um, então a ação replace () executa e remove o espaço.

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

Contar o número de espaços em uma 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; } 

Padrão .quote (“?”) Retorna o padrão literal String.

Meu método antes de encontrar a segunda resposta usando regex como uma solução melhor. Talvez alguém precise desse 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(); } 

aparar()

Remove apenas os espaços iniciais e finais.

Do Java Doc, “Retorna uma string cujo valor é esta string, com qualquer espaço em branco inicial e final removido.”

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

“D ev Dum my”

replace (), replaceAll ()

Substitui todas as strings vazias na palavra,

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

Saída:

 "DevDummy" "DevDummy" "DevDummy" 

Nota: “\ s +” é a expressão regular semelhante ao caractere de espaço vazio.

Referência: 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; } } } 

A solução acima é o algoritmo com a complexidade de O (n) sem usar nenhuma function java.

Por favor, use o código abaixo

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