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"
zyamat
la source
1
\\Wsignifie tous les non-mots voir download.oracle.com/javase/6/docs/api/java/util/regex/…
Nishant
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
Copie

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+","")
Gursel Koca
la source
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.)

nitro2k01
la source
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.)

Fletch
la source
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
62

Que diriez-vous replaceAll("\\s", ""). Reportez-vous ici .

Erkan Haspulat
la source
50
Quelle différence une minute de retard peut faire!
HDave
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é.

jahir
la source
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]+", "");
v.nivuahc
la source
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.

kamczak
la source
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

Jonas Elfström
la source
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"

Varejones
la source
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.

Ayaskant
la source
7

Vous pouvez le faire si simplement en

String newMysz = mysz.replace(" ","");
Vinod Ranga
la source
É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
avngr
la source
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

fatsoft
la source
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 .

JB Nizet
la source
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.

user27
la source
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);    
    }
}
jayesh
la source
3

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

Mohammad Raza
la source
il y a une réponse comme / égale à votre suggestion ci
omerhakanbilici
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
sendon1982
la source
3

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

"myString".replace(Regex("\\s+"), "")
Jemshit Iskenderov
la source
2
mysz = mysz.replace(" ","");

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

Ensuite, c'est fait.

user2357526
la source
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);
    }
}
Tony Nguyen
la source
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.

Mégawatt
la source
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]", "")

Rakesh Chaudhari
la source
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);
}
Abdur Rahman
la source
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);  
    }
}
user9832813
la source
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.

Rajesh Gurbani
la source
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
Deb
la source
0
private String generateAttachName(String fileName, String searchOn, String char1) {
    return fileName.replaceAll(searchOn, char1);
}


String fileName= generateAttachName("Hello My Mom","\\s","");
Abd Abughazaleh
la source
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();

    }

}
Kunal Vohra
la source