Comment supprimer les espaces blancs en double dans une chaîne en utilisant Java?


147

Comment supprimer les espaces blancs en double (y compris les tabulations, les retours à la ligne, les espaces, etc.) dans une chaîne en utilisant Java?

Réponses:


378

Comme ça:

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

Par exemple

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

les sorties

lorem ipsum dolor sit.

Qu'est-ce \s+que cela veut dire?

\s+est une expression régulière. \scorrespond à un espace, une tabulation, une nouvelle ligne, un retour chariot, un saut de page ou une tabulation verticale, et +dit "un ou plusieurs de ceux-ci". Ainsi, le code ci-dessus réduira toutes les "sous-chaînes d'espaces" de plus d'un caractère, avec un seul caractère d'espace.


Source: Java: suppression des espaces blancs en double dans les chaînes


3
@SuhrobSamiev - String.replaceAll () est en Java depuis JDK 1.4. docs.oracle.com/javase/1.4.2/docs/api/java/lang/… , java.lang.String)
David Moles

3
J'aimerais pouvoir ajouter plus de +1 pour l'explication impressionnante de \ s +.
Cyntech

J'ai compris \s+mais que signifie 2 contre-oblique \\?
saplingPro

2
Le littéral de chaîne "\\"représente la chaîne constituée d'une seule barre oblique inverse. Donc, pour \s+vous représenter, écrivez "\\s+".
aioobe

1
Cela supprimera-t-il le retour chariot? ou devrais-je supprimer "\\ r" séparément? Merci!
user3388884

24

Vous pouvez utiliser l'expression régulière

(\s)\1

et

remplacez-le par $1.

Code Java:

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

Si l'entrée est, "foo\t\tbar "vous obtiendrez "foo\tbar "comme sortie
Mais si l'entrée est, "foo\t bar"elle restera inchangée car elle n'a pas de caractères blancs consécutifs.

Si vous traitez tous les caractères d'espacement (espace, tabulation verticale, tabulation horizontale, retour chariot, saut de page, nouvelle ligne) comme un espace, vous pouvez utiliser l'expression régulière suivante pour remplacer n'importe quel nombre d'espace blanc consécutif par un seul espace:

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

Mais si vous souhaitez remplacer deux espaces blancs consécutifs par un seul espace, vous devez faire:

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

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

Où se stringtrouve votre chaîne sur laquelle vous devez supprimer les espaces blancs en double


9

salut le moyen le plus rapide (mais pas le plus joli) que j'ai trouvé est

while (cleantext.indexOf("  ") != -1)
  cleantext = StringUtils.replace(cleantext, "  ", " ");

cela fonctionne assez vite sur Android contrairement à une regex


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

1
Je sais, vous devez ajouter plus de ces boucles while pour d'autres entités. Mais ce code s'exécute beaucoup plus rapidement sur Android que ces regex, j'ai dû traiter des ebooks complets.
wutzebaer

Également énormément plus rapide sur le bureau. Je ne l'ai pas testé pour une grosse chaîne, mais si vous prévoyez de l'exécuter sur un grand nombre de petites chaînes, c'est la réponse que vous recherchez.
Ivelate

9
String str = "   Text    with    multiple    spaces    ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"

6

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 ce type. C'est:

   Hello!\n\n\nMy    World  

sera

 Hello!\nMy World 

Notez qu'il y a encore des espaces blancs au début et à la fin. Ma solution complète est donc:

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

Ici, trim()remplace toutes les chaînes d'espace blanc de début et de fin par "". (\\s)est pour capturer \\s(c'est-à-dire des espaces blancs tels que '', '\ n', '\ t') dans le groupe # 1 . +signe correspond à 1 ou plusieurs jetons précédents. Il (\\s)+peut donc s'agir de caractères consécutifs (1 ou plus) parmi n'importe quel caractère d'espacement («», «\ n» ou «\ t»). $1sert à remplacer les chaînes correspondantes par la chaîne du groupe n ° 1 (qui ne contient qu'un seul caractère d'espace blanc) du type correspondant (c'est-à-dire le caractère d'espace blanc unique qui correspond). La solution ci-dessus changera comme ceci:

   Hello!\n\n\nMy    World  

sera

Hello!\nMy World

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


0

Si vous souhaitez vous débarrasser de tous les espaces superflus de début et de fin, 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 en utilisant les autres stratégies répertoriées ici:

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

0

Vous pouvez également essayer d'utiliser String Tokeniser, pour n'importe quel espace, onglet, nouvelle ligne, etc. Un moyen simple est,

String s = "Your Text Here";        
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
{
    System.out.print(st.nextToken());
}

-10

Cela peut être possible en trois étapes:

  1. Convertir la chaîne en tableau de caractères (ToCharArray)
  2. Appliquer une boucle sur le tableau de caractères
  3. Appliquez ensuite la fonction de remplacement de chaîne (Replace ("sting you want to replace", "original string"));

1
Ce n'est pas une bonne solution, passer à un tableau de caractères ne résout rien. Vous n'expliquez pas vraiment comment faire le remplacement, qui est au cœur du problème. Veuillez également ne pas publier de liens totalement indépendants. Vous serez signalé comme spammeur si vous le faites.
Mat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.