Java comment remplacer 2 ou plusieurs espaces par un seul espace dans la chaîne et supprimer les espaces de début et de fin

271

Recherche d'un moyen rapide et simple en Java pour changer cette chaîne

" hello     there   "

à quelque chose qui ressemble à ceci

"hello there"

où je remplace tous ces espaces multiples par un seul espace, sauf que je veux aussi que le ou les espaces au début de la chaîne disparaissent.

Quelque chose comme ça me fait en partie là

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

mais pas tout à fait.

Nessa
la source
5
Vous devriez envisager d'accepter une réponse. Cela permet aux personnes qui arrivent plus tard sur la page de choisir une solution définitive.
Paul Rooney
1
C'est l'un des moyens les plus recommandés. =>. String nameWithProperSpacing = StringUtils.normalizeSpace (stringWithLotOfSpaces);
Kunal Vohra
s = s.replaceAll ("\\ s +", "");
Saroj Kumar Sahoo

Réponses:

462

Essaye ça:

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

Voir également


Aucun trim()regex

Il est également possible de le faire avec un seul replaceAll, mais cela est beaucoup moins lisible que la trim()solution. Néanmoins, il est fourni ici juste pour montrer ce que regex peut faire:

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

Il y a 3 suppléants:

  • ^_+ : toute séquence d'espaces au début de la chaîne
    • Correspondance et remplacement par $1, qui capture la chaîne vide
  • _+$ : toute séquence d'espaces à la fin de la chaîne
    • Correspondance et remplacement par $1, qui capture la chaîne vide
  • (_)+ : toute séquence d'espaces qui ne correspond à rien de ce qui précède, ce qui signifie qu'elle est au milieu
    • Match and replace with $1, qui capture un seul espace

Voir également

polygénelubrifiants
la source
11
+1, d'autant plus qu'il vaut la peine de noter que faire trim(), puis replaceAll()utilise moins de mémoire que de le faire dans l'autre sens. Pas beaucoup, mais si cela est appelé plusieurs fois, cela pourrait s'additionner, surtout s'il y a beaucoup de "blancs ajustables". ( Trim()ne se débarrasse pas vraiment de l'espace supplémentaire - il le masque simplement en déplaçant les valeurs de début et de fin. Le sous-jacent char[]reste inchangé.)
corsiKa
2
Ce n'est qu'un détail, mais je pense que ( ) +ou ( ){2,}devrait être (très) un peu plus efficace;)
sp00m
6
Nice regexp. Remarque: le remplacement de l'espace `` par \\sremplacera tout groupe d'espaces avec le caractère souhaité.
djmj
1
Notez que la partie () + correspondra à un seul espace et le remplacera par un seul espace. Peut-être (<espace> <espace> +) serait mieux, donc il ne correspond que s'il y a plusieurs espaces et le remplacement apportera une modification nette à la chaîne.
Lee Meador
2
Comme Lee Meador l'a mentionné, .trim().replaceAll(" +", " ")(avec deux espaces) est plus rapide que .trim().replaceAll(" +", " ")(avec un espace). J'ai effectué des tests de synchronisation sur des chaînes qui n'avaient que des espaces simples et tous des espaces doubles, et cela est arrivé beaucoup plus rapidement pour les deux lors de nombreuses opérations (des millions ou plus, selon l'environnement).
Gary S. Weaver
154

Vous avez juste besoin d'un:

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

où vous faites correspondre un ou plusieurs espaces et les remplacez par un seul espace, puis coupez les espaces blancs au début et à la fin (vous pouvez en fait inverser en coupant d'abord puis en faisant correspondre pour rendre l'expression régulière plus rapide comme quelqu'un l'a souligné).

Pour tester cela rapidement, essayez:

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

et il renverra:

"hello there"
sarah.ferguson
la source
3
Je couperais probablement d'abord parce que vous économisez un peu de travail sur l'expression régulière.
Michael
3
@ sarah.ferguson Veuillez retirer le crochet final ")" qui ne devrait pas être là dans le premier replaceAll. Merci. - Le système ne m'a pas laissé faire! (Pas moins de 6 caractères sont éligibles pour une modification ..)
mwarren
2
Notez que cela remplace un espace par un autre espace dans le cas où il n'y a pas plusieurs espaces ensemble. Il n'est pas nécessaire de faire le remplacement dans ce cas, même si vous le souhaitez, car vous remplacez également un onglet par un seul espace. Ce serait bien de ne reconnaître que plusieurs espaces.
Lee Meador
2
@geowar où la question demandait-elle des onglets désolé? Je suis sûr que ce qui précède ne remplace pas aussi les symboles ☮ d'ailleurs .. et ni ✌ ...
sarah.ferguson
2
attendez une seconde @geowar Cela remplace une seule table par un espace. Je viens de l'essayer
user1870400
42

Utilisez la StringUtils.normalizeSpace(String str)méthode Apache commons . Voir les documents ici

Monica Granbois
la source
Bonne idée, mais cela supprime entre autres les nouvelles lignes
Somaiah Kumbera
20

Cela a parfaitement fonctionné pour moi: sValue = sValue.trim().replaceAll("\\s+", " ");

Docteur
la source
1
Les gens ont modifié ma réponse. L'original était: sValue = sValue.replaceAll ("\ s +", "") .trim ();
Docteur
2
A été modifié parce que votre réponse d'origine supprime tous les espaces et ce n'est pas ce que le PO a demandé
Jose Rui Santos
17
"[ ]{2,}"

Cela correspondra à plus d'un espace.

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

PRODUCTION:

hello there
Gitesh Dalal
la source
13

Pour éliminer les espaces au début et à la fin de la chaîne, utilisez la String#trim()méthode. Et puis utilisez votre mytext.replaceAll("( )+", " ").

folone
la source
12

Vous pouvez d'abord utiliser String.trim(), puis appliquer la commande regex replace sur le résultat.

Eyal Schneider
la source
10
trim () supprimera tout l'espace au début et à la fin de la chaîne, il ne s'applique pas à l'espace entre les mots
vuhung3990
10

Le code suivant compacte tout espace entre les mots et en supprime tout au début et à la fin de la chaîne

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

Cela produira a string with many spaces, a tab and a newline

Notez que tous les caractères non imprimables, y compris les espaces, les tabulations et les nouvelles lignes seront compactés ou supprimés


Pour plus d'informations, consultez la documentation correspondante:

xcuipir
la source
9

Essaye celui-là.

Exemple de code

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

PRODUCTION

hello there

Tout d'abord, il remplacera tous les espaces par un seul espace. Que nous devons supposer faire le découpage, Stringcar le début du Stringet la fin du Stringremplacera tout l'espace par un seul espace s'il y Stringa des espaces au début du Stringet à la fin du Stringdonc nous devons les découper. Que vous obtenez votre désir String.

Raj S. Rusia
la source
4

Vous pouvez également utiliser des contournements.

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

OU

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

<space>(?= )correspond à un caractère espace qui est suivi d'un autre caractère espace. Donc, dans des espaces consécutifs, il correspondrait à tous les espaces sauf le dernier car il n'est pas suivi d'un caractère d'espace. Cela vous laisse un seul espace pour les espaces consécutifs après l'opération de suppression.

Exemple:

    String[] tests = {
            "  x  ",          // [x]
            "  1   2   3  ",  // [1 2 3]
            "",               // []
            "   ",            // []
        };
        for (String test : tests) {
            System.out.format("[%s]%n",
                test.replaceAll("^ +| +$| (?= )", "")
            );
        }
Avinash Raj
la source
De la façon dont vous l'avez, il fera correspondre n'importe quel espace sur le devant ou la fin ou tout autre espace avec un autre espace après. Cela signifie que "a .... b" correspondra 3 fois et remplacera trois fois. Il itère sur tous les espaces internes à l'intérieur de la méthode replaceAll (). Vous pouvez peut-être le modifier pour qu'il corresponde à n'importe quelle séquence de 2 espaces ou plus à la fois et réduire l'itération interne.
Lee Meador
Peut-être que <espace> + (? = <espace>) le ferait.
Lee Meador
4

réduire()

Supprime uniquement les espaces de début et de fin.

À partir de Java Doc, "Renvoie une chaîne dont la valeur est cette chaîne, sans les espaces de début et de fin supprimés."

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

"D ev Dum my"

replace (), replaceAll ()

Remplace toutes les chaînes vides du mot,

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

Production:

"DevDummy"

"DevDummy"

"DevDummy"

Remarque: "\ s +" est l'expression régulière similaire au caractère d'espace vide.

Référence: https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html

Sameera
la source
4

Beaucoup de réponses correctes ont été fournies jusqu'à présent et je vois beaucoup de votes positifs. Cependant, les manières mentionnées fonctionneront mais pas vraiment optimisées ou pas vraiment lisibles. J'ai récemment découvert la solution qui plaira à tous les développeurs.

String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );

Vous avez terminé. C'est une solution lisible.

Kunal Vohra
la source
3

À Kotlin, cela ressemblerait à ceci

val input = "\n\n\n  a     string with     many    spaces,    \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")
Rafael
la source
2
String str = " hello world"

réduire d'abord les espaces

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

mettre en majuscule la première lettre et tout le reste en minuscules

str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();
KhaledMohamedP
la source
2
mytext = mytext.replaceAll("\\s+"," ");
k sarath
la source
Les réponses uniquement codées sont déconseillées. Veuillez cliquer sur modifier et ajouter quelques mots résumant comment votre code répond à la question, ou peut-être expliquer en quoi votre réponse diffère des réponses précédentes. Merci
Nick
1

Cela a fonctionné pour moi

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

où le filtre est la fonction suivante et scan est la chaîne d'entrée:

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();
}
Mr_Hmp
la source
1
Cela remplacerait <space> <tab> par un espace mais pas <tab> <tab>. C'est un problème mineur, semble-t-il.
Lee Meador
1

tu devrais le faire comme ça

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

mettre + entre parenthèses rondes.

kiro malak
la source
1
String str = "  this is string   ";
str = str.replaceAll("\\s+", " ").trim();
Ajinkya_M
la source
0

Tu vois String.replaceAll.

Utilisez l'expression régulière "\s"et remplacez-la par " ".

Ensuite, utilisez String.trim.

Zak
la source
1
new String ("hello there") .replaceAll ("\\ s", "+") renvoie un + hello +++++++ there +++ donc ne fonctionne définitivement pas ..
sarah.ferguson
1
Essayeznew String(" hello there ").trim().replaceAll("\\s+", " ")
manish_s
0

vérifie ça...

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

} 

Si String ne contient qu'un seul espace, replace () ne remplacera pas,

Si les espaces sont plus d'un, l'action Replace replace () effectue et supprime les espaces.

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

Pour compter le nombre d'espaces dans une chaîne.

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

Le motif .quote ("?") Renvoie le motif littéral String.

Yash
la source
0

Ma méthode avant de trouver la deuxième réponse en utilisant l'expression régulière comme meilleure solution. Peut-être que quelqu'un a besoin de ce 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();
}
trinity420
la source
Intéressant, mais un espace blanc signifie plus que des blancs.
Laur Ivan
@LaurIvan que voulez-vous dire?
trinity420
cette entrée a une bonne explication sur ce qui \ssignifie dans les expressions régulières (espace, tabulation, nouvelle ligne, saut de page).
Laur Ivan
@LaurIvan Votre lien est rompu mais vous avez raison. Ce problème pourrait être résolu en itérant dans la chaîne d'entrée, en supprimant tous les caractères non alphabétiques, non numériques et non spatiaux, je pense.
trinity420
0

Version Stream, filtre les espaces et les tabulations.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
Aris2World
la source
0
String myText = "   Hello     World   ";
myText = myText.trim().replace(/ +(?= )/g,'');


// Output: "Hello World"
alaswer
la source
0

La méthode la plus simple pour supprimer les espaces blancs n'importe où dans la chaîne.

 public String removeWhiteSpaces(String returnString){
    returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
    return returnString;
}
Sandun Susantha
la source
-1
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 solution ci-dessus est l'algorithme avec la complexité de O (n) sans utiliser de fonction java.

devmohd
la source
-1

Veuillez utiliser le code ci-dessous

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());
    }
}
Piyush
la source
-1

Bonjour désolé pour le retard! Voici la réponse la meilleure et la plus efficace que vous recherchez:

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

Donc, votre sortie de cet exemple sera: Mon nom est kingkon.

Cependant, cette méthode supprimera également le "\ n" que peut contenir votre chaîne. Donc, si vous ne le souhaitez pas, utilisez simplement cette méthode simple:

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

Et si vous souhaitez également supprimer les espaces de début et de fin, ajoutez simplement:

str = str.trim();
kostas poimenidhs
la source
-1

Je sais que la méthode replaceAll est beaucoup plus facile, mais je voulais également la publier.

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;
}
esranur
la source
1
Même si cela fonctionne, c'est loin d'être la solution la plus simple.
platzhersh
-1

Le Tokenizer de chaîne peut être utilisé

 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());
Swaran
la source