web-dev-qa-db-fra.com

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

Vous cherchez un moyen simple et rapide 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 souhaite également supprimer le ou les espaces au début de la chaîne.

Quelque chose comme ça m'amène en partie là

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

mais pas tout à fait.

219
Nessa

Essaye ça:

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

Voir également


Non trim() regex

Il est également possible de le faire avec une seule replaceAll, mais cela est beaucoup moins lisible que la solution trim(). 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
    • Correspond à et remplace avec $1, qui capture la chaîne vide
  • _+$: toute séquence d'espaces à la fin de la chaîne
    • Correspond à et remplace avec $1, qui capture la chaîne vide
  • (_)+: toute séquence d'espaces ne correspondant à rien de ce qui précède, c'est-à-dire qu'elle est au milieu
    • Correspondre et remplacer par $1, qui capture un seul espace

Voir également

381

Vous avez juste besoin d'un:

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

où vous faites correspondre un ou plusieurs espaces et que vous les remplacez par un seul espace, puis ajustez les espaces au début et à la fin (vous pouvez en fait inverser d’abord en ajustant puis en faisant correspondre les espaces pour rendre la regex plus rapide, comme l’indique quelqu'un).

Pour tester ceci rapidement, essayez:

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

et il reviendra: 

"hello there"
131
sarah.ferguson

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

34
Monica Granbois

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

15
Doctor

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

13
folone

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

12
Eyal Schneider

Essaye celui-là.

Exemple de code

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

SORTIE

hello there

Tout d'abord, tous les espaces seront remplacés par un seul espace. Alors nous devons supposer que nous ajustions String car les débuts de String et fin de String remplacera tout l'espace par un seul espace si String a des espaces au début de String et fin de String. Alors vous obtenez votre String désirée.

8
Raj S. Rusia
"[ ]{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);

SORTIE:

hello there
7
Gitesh Dalal

Vous pouvez également utiliser des lookarounds.

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

OU

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

<space>(?= ) correspond à un caractère espace suivi d'un autre caractère espace. Ainsi, 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("^ +| +$| (?= )", "")
            );
        }
3
Avinash Raj

réduire()

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

De Java Doc, "Retourne une chaîne dont la valeur est cette chaîne, tous les espaces de début et de fin étant supprimés."

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

"D ev Dum mon"

replace (), replaceAll ()

Remplace toutes les chaînes vides de la Parole,

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

Sortie:

"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

2
Sameera

Bonjour désolé pour le retard! Voici la réponse optimale et 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, " "));
}

Votre sortie de cet exemple sera donc: Je m'appelle kingkon.  

Cependant, cette méthode supprimera également le "\ n" que votre chaîne peut avoir. Donc, si vous ne voulez pas utiliser 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();
1
Kostas Poime

Cela a fonctionné pour moi

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

où filter 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();
}
1
Mr_Hmp

tu devrais le faire comme ça

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

mettre + à l'intérieur des crochets ronds.

1
kiro malak
String str = " hello world"

réduire les espaces d'abord 

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

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

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

Ma méthode avant que je trouve la deuxième réponse en utilisant regex comme une 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();
}
0
trinity420

Version en streaming, filtre les espaces et les onglets.

Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
0
Aris2World

Le code suivant compactera tous les espaces entre les mots et supprimera ceux 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);

Ceci 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, voir la documentation correspondante:

0
xcuipir

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 sera pas remplacé, 

Si les espaces sont plusieurs, l'action replace () remplit et supprime spacess.

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

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

Pattern . Quote ("?") Renvoie un modèle littéral String.

0
Yash

Voir String.replaceAll.

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

Ensuite, utilisez String.trim.

0
Zak

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

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