319 votes

Java, comment remplacer 2 espaces ou plus par un seul espace dans une chaîne de caractères et supprimer les espaces avant et après.

Je cherche un moyen simple et rapide de modifier cette chaîne en Java.

" 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 permet d'y arriver en partie

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

mais pas tout à fait.

7 votes

Vous devriez envisager d'accepter une réponse. Cela permet aux personnes qui arrivent sur la page plus tard de choisir plus facilement une solution définitive.

2 votes

C'est l'une des méthodes les plus recommandées. => . String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces ) ;

2 votes

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

536voto

polygenelubricants Points 136838

Essayez ça :

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

Voir aussi


Non trim() regex

Il est également possible de faire cela avec une seule replaceAll mais elle est beaucoup moins lisible que l'option trim() solution. Néanmoins, elle est fournie 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 de caractères
    • Correspondre et remplacer par $1 qui capture la chaîne vide
  • _+$ : toute séquence d'espaces à la fin de la chaîne de caractères
    • Correspondre et remplacer par $1 qui capture la chaîne vide
  • (_)+ : toute séquence d'espaces qui ne correspond à aucun des éléments ci-dessus, ce qui signifie qu'elle se trouve au milieu.
    • Correspondre et remplacer par $1 qui capture un espace unique

Voir aussi

11 votes

+1, d'autant plus qu'il convient de noter que le fait de faire trim() et ensuite replaceAll() utilise moins de mémoire que dans l'autre sens. Pas de beaucoup, mais si cela est appelé de nombreuses fois, cela peut s'accumuler, surtout s'il y a beaucoup d'"espaces blancs à découper". ( Trim() ne supprime pas vraiment l'espace supplémentaire - il le masque simplement en déplaçant les valeurs de début et de fin. Les valeurs sous-jacentes char[] reste inchangé).

0 votes

Je ne suis pas un expert, mais en utilisant votre description de trim(), si la chaîne originale est supprimée, ne va-t-elle pas également supprimer la chaîne coupée qui en fait partie ?

2 votes

C'est juste un détail, mais je pense que ( ) + o ( ){2,} devrait être un (très) peu plus efficace ;)

171voto

sarah.ferguson Points 391

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 pourriez en fait inverser en coupant d'abord et en faisant correspondre ensuite pour rendre la regex plus rapide, comme quelqu'un l'a fait remarquer).

Pour tester cela, essayez rapidement :

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

et il reviendra :

"hello there"

0 votes

Cela a fonctionné pour moi, puisque ma chaîne de caractères comportait également de nouvelles lignes avec des espaces blancs

3 votes

Je couperais probablement en premier parce que cela évite un peu de travail à la regex.

3 votes

@sarah.ferguson Veuillez supprimer la parenthèse finale ")" qui ne devrait pas être là dans le premier replaceAll. Merci. - Le système ne me permettait pas de le faire ! (Rien de moins de 6 chars n'est éligible pour une modification..)

15voto

folone Points 4523

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

12voto

Eyal Schneider Points 11399

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

12 votes

Trim() supprimera tous les espaces au début et à la fin de la chaîne, mais pas les espaces entre les mots.

1voto

Zak Points 10160

Ver String.replaceAll .

Utilisez la regex "\s" et remplacer par " " .

Ensuite, utilisez String.trim .

1 votes

New String(" hello there ").replaceAll(" \\s ", "+") renvoie un +hello+++++++there+++ donc ne fonctionne absolument pas

1 votes

Essayez new String(" hello there ").trim().replaceAll("\\s+", " ")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X