2010-10-18 5 views

Répondre

354

Comme ceci:

yourString = yourString.replaceAll("\\s+", " "); 

Par exemple

System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " ")); 

sorties

lorem ipsum dolor sit. 

Qu'est-ce que cela signifie \s+?

est une expression régulière. \s correspond à un espace, une tabulation, une nouvelle ligne, un retour chariot, un saut de page ou un onglet vertical, et + indique "un ou plusieurs d'entre eux". Ainsi, le code ci-dessus écrase toutes les "sous-chaînes d'espaces" de plus d'un caractère, avec un caractère espace unique.


Source: Java: Removing duplicate white spaces in strings

+0

pourquoi il n'y a pas de méthode replaceAll ?? Est-ce que le dernier JDK supporte cette méthode ??? –

+2

@SuhrobSamiev - String.replaceAll() est en Java depuis le JDK 1.4. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String) –

+3

J'aimerais pouvoir ajouter plus de +1 pour l'explication géniale de \ s +. – Cyntech

9

Essayez ceci - Vous devez import java.util.regex.*;

Pattern pattern = Pattern.compile("\\s+"); 
    Matcher matcher = pattern.matcher(string); 
    boolean check = matcher.find(); 
    String str = matcher.replaceAll(" "); 

string est votre chaîne sur laquelle vous devez supprimer les espaces blancs en double

23

Vous pouvez utiliser la regex

(\s)\1 

et

le remplacer par $1.

code Java:

str = str.replaceAll("(\\s)\\1","$1"); 

Si l'entrée est "foo\t\tbar " vous obtiendrez "foo\tbar " en sortie
Mais si l'entrée est "foo\t bar" il ne changera pas parce qu'elle n'a pas de caractères blancs consécutifs.

Si vous traitez tous les caractères blancs (espace, tabulation verticale, tabulation horizontale, retour de chariot, de forme, nouvelle ligne) que l'espace que vous pouvez ensuite utiliser l'expression rationnelle suivante pour remplacer tout nombre d'espaces consécutifs avec un seul espace:

str = str.replaceAll("\\s+"," "); 

Mais si vous voulez remplacer deux espaces consécutifs avec un seul espace que vous devez faire:

str = str.replaceAll("\\s{2}"," "); 
-10

Cela peut être possible en trois étapes:

  1. Convertir la chaîne pour tableau de caractères (ToCharArray)
  2. Appliquer boucle sur la matrice de charater
  3. Appliquez ensuite la chaîne remplacer la fonction (Remplacer (« vous piquer à remplacer », « chaîne d'origine »));
+1

Ce n'est pas une bonne solution, tomber dans un tableau char ne résout rien. Vous n'êtes pas en train d'expliquer comment faire le remplacement, qui est le cœur du problème. Aussi, veuillez ** ne pas ** publier des liens complètement indépendants. Vous serez marqué comme un spammeur si vous le faites. – Mat

0

Si vous voulez vous débarrasser de tous les espaces avant et étrangers alors que vous voulez faire quelque chose comme ceci:

// \\A = Start of input boundary 
// \\z = End of input boundary 
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1"); 

Ensuite, vous pouvez supprimer les doublons avec les autres stratégies énumérées ici:

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

salut i est trouvé

while (cleantext.indexOf(" ") != -1) 
    cleantext = StringUtils.replace(cleantext, " ", " "); 
le plus rapide (mais pas la plus jolie façon)

+1

Fonctionne uniquement pour les espaces mais pas pour les autres espaces tels que les onglets et les retours à la ligne. – Pang

+1

Je sais, vous devez ajouter plus de ces boucles en boucle pour d'autres entités. Mais ce code fonctionne beaucoup plus vite sur Android que ces regex, j'ai dû traiter des ebooks complets. – wutzebaer

+0

Énormément plus rapide sur le bureau aussi. N'a pas testé pour une grosse chaîne, mais si vous prévoyez de l'exécuter sur beaucoup de petites chaînes c'est la réponse que vous recherchez. – Ivelate

5

Bien qu'il soit trop tard, j'ai trouvé une meilleure solution (qui fonctionne pour moi) qui remplacera tous les espaces blancs consécutifs de même type par un espace blanc de son type. C'est:

Hello!\n\n\nMy World 

sera

Hello!\nMy World 

avis il y a encore avant et arrière des espaces blancs. Donc, ma solution complète est:

str = str.trim().replaceAll("(\\s)+", "$1")); 

Ici, trim() remplace toutes les chaînes avant et arrière de l'espace blanc avec « ». (\\s) est pour capturer \\s (c'est-à-dire des espaces blancs tels que '', '\ n', '\ t') dans groupe # 1. Le signe + sert à faire correspondre 1 ou plusieurs jetons précédents. Ainsi, (\\s)+ peut être des caractères consécutifs (1 ou plus) parmi tous les caractères d'espace blanc ('', '\ n' ou '\ t'). $1 est de remplacer les chaînes correspondantes par la chaîne groupe # 1 (qui contient seulement 1 caractère espace blanc) du type correspondant (c'est le caractère d'espace blanc unique qui a correspondu). La solution ci-dessus changera comme ceci:

Hello!\n\n\nMy World 

sera

Hello!\nMy World 

Je ne l'ai pas trouvé ma solution ci-dessus ici, donc je l'ai posté.

0

Vous pouvez également essayer d'utiliser String Tokeniser pour tout espace, onglet, nouvelle ligne, etc. Une façon simple est,

String s = "Your Text Here";   
StringTokenizer st = new StringTokenizer(s, " "); 
while(st.hasMoreTokens()) 
{ 
    System.out.print(st.nextToken()); 
} 
8
String str = " Text with multiple spaces "; 
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str); 
// str = "Text with multiple spaces" 
Questions connexes