Suppression des espaces blancs des chaînes en Java


684

J'ai une chaîne comme celle-ci:

mysz = "name=john age=13 year=2001";

Je souhaite supprimer les espaces blancs de la chaîne. J'ai essayé trim()mais cela ne supprime que les espaces blancs avant et après la chaîne entière. J'ai également essayé, replaceAll("\\W", "")mais le =fichier est également supprimé.

Comment puis-je réaliser une chaîne avec:

mysz2 = "name=johnage=13year=2001"


76
Quel est votre plan avec la chaîne "name = johnage = 13year = 2001"? Pas pour l'analyser, j'espère.
Jonas Elfström

4
@ JonasElfström J'imagine que cela peut aider à comparer les chaînes
Isaac

que diriez-vous si la chaîne est réellement = "". Est-ce que trims () fait effacer la chaîne vide comme je l'ai mentionné? @zyamat?
gumuruh

Réponses:


1289

st.replaceAll("\\s+","")supprime tous les espaces et les caractères non visibles (par exemple, tabulation \n).


st.replaceAll("\\s+","")et st.replaceAll("\\s","")produire le même résultat.

Le deuxième regex est 20% plus rapide que le premier, mais à mesure que le nombre d'espaces consécutifs augmente, le premier fonctionne mieux que le second.


Attribuez la valeur à une variable, si elle n'est pas utilisée directement:

st = st.replaceAll("\\s+","")

34
Je voudrais noter que ces deux expressions régulières produiront des résultats différents si vous cherchez à remplacer tous les espaces par un seul espace (ou un autre ensemble de caractères). Si vous avez des espaces consécutifs, l'utilisation de \\ s remplacera chaque caractère d'espacement par les caractères fournis. Étant donné \\ s +, il remplacera chaque ensemble d'espaces par une seule chaîne de remplacement. Je peux voir un bon nombre de cas où les gens peuvent venir à ce poste pour remplacer des espaces par quelque chose qui n'est pas qu'une chaîne vide, et cela peut être utile.
Caitlin

2
mais il ne supprime pas l'espace blanc s'il se trouve au début de la chaîne.
solitaire

@lonesome utilise .trim () pour cela
CQM

6
Utilisez simplement StringUtils d'apache-commons. C'est une méthode statique appelée StringUtils.deleteWhitespace.
Crozeta

@Gursel merci pour la réponse et la comparaison des performances pour deux regex. Je me demandais pourquoi il y avait une différence de performances entre deux? Y a-t-il quelque chose qui me manque, pourriez-vous s'il vous plaît me signaler toute référence qui parle plus de la différence de performances
Vishrant

248
replaceAll("\\s","")

\w = Tout ce qui est un caractère de mot

\W = Tout ce qui n'est pas un mot (y compris la ponctuation, etc.)

\s = Tout ce qui est un espace (y compris l'espace, les tabulations, etc.)

\S = Tout ce qui n'est pas un espace (y compris les lettres et les chiffres, ainsi que la ponctuation, etc.)

(Modifier: Comme indiqué, vous devez échapper à la barre oblique inverse si vous souhaitez \satteindre le moteur d'expression régulière, ce qui entraîne \\s.)


103

La réponse la plus correcte à la question est:

String mysz2 = mysz.replaceAll("\\s","");

Je viens d'adapter ce code à partir des autres réponses. Je le poste car en plus d'être exactement ce que la question demandait, cela démontre également que le résultat est retourné sous forme de nouvelle chaîne, la chaîne d'origine n'est pas modifiée comme certaines réponses l'impliquent.

(Les développeurs Java expérimentés pourraient dire "bien sûr, vous ne pouvez pas réellement modifier une chaîne", mais le public cible de cette question peut ne pas le savoir.)


Cela signifie-t-il que nous pouvons remplacer la chaîne d'origine en écrivant par exemple: S = S.replaceAll ("\\ s", ""); alors que d'abord le remplacement sera fait et ensuite S recevra la version
dépouillée

@frogeyedpeas Qui écrase la variable Smais n'écrase pas la chaîne qui Spointe vers.
Rétablir Monica

J'ai sauvé ma journée! ;)
Paras Jain


45

Une façon de gérer les manipulations de chaînes est StringUtils de Apache commons.

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

Vous pouvez le trouver ici . commons-lang inclut beaucoup plus et est bien supporté.


Cela a l'avantage d'être plus lisible.
payne

36

Si vous devez également supprimer des espaces incassables, vous pouvez mettre à niveau votre code comme ceci:

st.replaceAll("[\\s|\\u00A0]+", "");

Cela échoue pour: " ab c "
Mohd Farid

1
@MohdFarid Appliqué un correctif, ça doit être ok maintenant.
Denis Kulagin

Je pense que cela devrait être st.replaceAll ("[\\ s | \ u00A0] +", "");
paramupk

30

Si vous préférez les classes utilitaires aux expressions régulières, il existe une méthode trimAllWhitespace (String) dans StringUtils dans Spring Framework.


13
Les idées alternatives sont les bienvenues. Ils aideront certaines personnes, même si ce n'est pas tout le monde.
james.garriss

25

Vous avez déjà la bonne réponse de Gursel Koca, mais je pense qu'il y a de fortes chances que ce ne soit pas vraiment ce que vous voulez faire. Que diriez-vous d'analyser les valeurs-clés à la place?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

sortie:
nom = john
age = 13
an = 2001


22

Tu devrais utiliser

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

au lieu de:

s.replaceAll("\\s", "");

De cette façon, cela fonctionnera avec plus d'un espace entre chaque chaîne. Le signe + dans l'expression régulière ci-dessus signifie "un ou plusieurs \ s"


2
J'ai tapé un exemple rapide pour vérifier cela, car cela me semblait étrange et j'ai constaté que le signe plus ajouté n'était pas nécessaire. Plusieurs espaces séparant les mots sont consommés. La raison en est probablement que se replaceAllrépète jusqu'à ce que le motif ne corresponde à aucune partie de la chaîne.
nyaray

2
En effet. Le +peut le rendre CPU légèrement plus convivial, car les espaces consécutifs est gérée en une seule opération de remplacement, mais c'est la seule différence dans ce cas. C'est en effet le All, pas celui +qui remplace les espaces non consécutifs dans la chaîne.
nitro2k01

il ne supprime pas cela (u00A0)
Kerim FIRAT

8

Pour ce faire, la méthode la plus simple consiste à utiliser la org.apache.commons.lang3.StringUtilsclasse de commons-lang3bibliothèque telle que "commons-lang3-3.1.jar " par exemple.

Utilisez la méthode statique " StringUtils.deleteWhitespace(String str)" sur votre chaîne d'entrée et elle vous renverra une chaîne après en avoir supprimé tous les espaces blancs. J'ai essayé votre exemple de chaîne " name=john age=13 year=2001" et il m'a renvoyé exactement la chaîne que vous vouliez - " name=johnage=13year=2001". J'espère que cela t'aides.


7

Vous pouvez le faire si simplement en

String newMysz = mysz.replace(" ","");

Étonnamment, le seul travailleur dans ma situation. Merci.
Valeriy

6
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

4
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

// ça marche bien avec tous les espaces * n'oubliez pas l'espace dans la piqûre b


Très utile, mais ne répond pas à la question affichée!
BuvinJ

3

\Wsignifie "caractère non mot". Le motif des caractères d'espacement est \s. Ceci est bien documenté dans le javadoc Pattern .


8
Où est le reste de cette réponse?
LS

3

En java, nous pouvons faire l'opération suivante:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

pour cela, vous devez importer les packages suivants dans votre programme:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

j'espère que cela vous aidera.


Ces informations ont été fournies par d'autres années avant que vous ne publiez votre réponse.
jan groth

3

En utilisant Pattern And Matcher, il est plus dynamique.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}


3

Utiliser une classe d'utilisation de chaîne apache est préférable pour éviter NullPointerException

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

Production

abcdef

3

Lors de l'utilisation st.replaceAll("\\s+","")dans Kotlin , assurez-vous d'envelopper "\\s+"avec Regex :

"myString".replace(Regex("\\s+"), "")

2
mysz = mysz.replace(" ","");

D'abord avec de l'espace, ensuite sans espace.

Ensuite, c'est fait.


7
Juste pour clarifier, l'espace signifie [ \t\n\x0B\f\r]. Vous ne faites que des [ ]espaces normaux .
GKFX

2
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}


1

Pour supprimer des espaces dans votre exemple, voici une autre façon de procéder:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

Ce qu'il fait, c'est qu'il le convertit en un tableau avec les espaces étant les séparateurs, puis il combine les éléments du tableau ensemble sans les espaces.

Cela fonctionne plutôt bien et est facile à comprendre.


2
Mais une solution très inefficace. Et, comme vous pouvez le voir dans les autres solutions - cela ne fonctionne que pour "" l 'espace - et non pour différents types d' espaces blancs.
GhostCat

1

Il y a d'autres caractères d'espace qui existent aussi dans les chaînes. Il est donc possible que nous devions remplacer les caractères d'espace par les chaînes.

Ex: ESPACE NO-BREAK, ESPACE TROIS PAR EM, ESPACE DE PUNCTUATION

Voici la liste des caractères spatiaux http://jkorpela.fi/chars/spaces.html

Nous devons donc modifier

\ u2004 nous pour ESPACE TROIS POUR EM

s.replaceAll ("[\ u0020 \ u2004]", "")


0

Les espaces blancs peuvent être supprimés à l'aide de la fonction isWhitespace de la classe de caractères.

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

0

Séparez chaque groupe de texte dans sa propre sous-chaîne, puis concaténez ces sous-chaînes:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

0
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

Cela pourrait aider.


0

Vous pouvez également consulter le code Java ci-dessous. Les codes suivants n'utilisent aucune méthode "intégrée".

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

Contribution:

String inp = "01239Debashish123Pattn456aik";

Production:

The String is: 01239123456

0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");

0

Beaucoup de réponses sont fournies. Je voudrais donner une solution qui est tout à fait lisible et meilleure que regex.

import java.io.IOException;

import org.apache.commons.lang.StringUtils;

public class RemoveAllWhitespaceTest {

    public static void main(String[] args) throws IOException {

        String str1 = "\n\tThis is my string \n \r\n  !";

        System.out.println("[" + str1 + "]");

        System.out.println("Whitespace Removed:");

        System.out.println("[" + StringUtils.deleteWhitespace(str1) + "]");

        System.out.println();

    }

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