Comment diviser une chaîne avec des caractères d'espacement en tant que délimiteurs


555

Quel modèle regex aurais - je besoin de passer à java.lang.String.split() diviser une chaîne en un tableau de sous - chaînes en utilisant tous les caractères (espaces blancs ' ', '\t', '\n', etc.) comme délimiteurs?

Réponses:


955

Quelque chose dans les lignes de

myString.split("\\s+");

Cela regroupe tous les espaces blancs comme délimiteur.

Donc, si j'ai la chaîne:

"Hello[space][tab]World"

Cela devrait produire les chaînes "Hello"et "World"et omettre l'espace vide entre le [space]et le [tab].

Comme VonC a souligné, la barre oblique inverse doit être échappé, parce que Java serait d' abord essayer d'échapper à la chaîne à un caractère spécial, et envoyer ce à analyser. Ce que vous voulez, c'est le littéral "\s", ce qui signifie que vous devez passer "\\s". Cela peut devenir un peu déroutant.

L' \\séquivalent à [ \\t\\n\\x0B\\f\\r].


1
Merci pour ce rappel. Je venais de coder de la hanche :)
Henrik Paul

34
Notez que vous devez d' trim()abord: trim().split("\\s++")- sinon, par exemple, le fractionnement de `abc` émettra d'abord deux chaînes vides.
Marcus Junius Brutus

Pourquoi avez-vous utilisé quatre barres obliques inverses vers la fin de votre réponse? c'est à dire. "\\\\s"?
Michael Borkowski

"" .trim (). split ("\\ s +") - la chaîne vide split vous donne une longueur de 1. "term" .trim (). split ("\\ s +") - vous donne également une longueur de 1 .
PaulSchell

88

Dans la plupart des dialectes d'expression régulière, il existe un ensemble de résumés de caractères pratiques que vous pouvez utiliser pour ce genre de chose - ce sont de bons à retenir:

\w - Correspond à n'importe quel caractère de mot.

\W - Correspond à tout caractère non mot.

\s - Correspond à tout caractère d'espace blanc.

\S - Correspond à tout sauf aux espaces blancs.

\d - Correspond à n'importe quel chiffre.

\D - Correspond à tout sauf aux chiffres.

Une recherche de "Regex Cheatsheets" devrait vous récompenser avec beaucoup de résumés utiles.




64

Pour que cela fonctionne en Javascript , j'ai dû faire ce qui suit:

myString.split(/\s+/g)

15
C'est en Javascript. Je n'y
prêtais

14
Oops. Mon erreur. Peut-être que cette réponse aidera encore d'autres qui tombent sur ce fil tout en recherchant une réponse Javascript. :-)
Mike Manard

Haha, je cherchais une réponse pour JavaScript, j'ai accidentellement rencontré cette question, puis j'ai remarqué votre réponse avant de partir. +1.
Kris

C'est génial! Je suis heureux d'apprendre que cette réponse s'est avérée utile pour quelqu'un, même si elle a répondu à la mauvaise question. :-)
Mike Manard

Cela m'a aussi beaucoup aidé, j'avais besoin de séparer les arguments du serveur :)
ProgrammerPlays


11

Vous pouvez également avoir un espace insécable UniCode xA0 ...

String[] elements = s.split("[\\s\\xA0]+"); //include uniCode non-breaking

ça m'aide!
Surasin Tancharoen

10
String string = "Ram is going to school";
String[] arrayOfString = string.split("\\s+");

@Stephan, je ne les ai pas vus.
Flèche


2

Puisqu'il s'agit d'une expression régulière, et je suppose que u ne voudrait pas non plus de caractères non alphanumériques comme des virgules, des points, etc. qui pourraient être entourés de blancs (par exemple, "un, deux" devrait donner [un] [deux]), ça devrait être:

myString.split(/[\s\W]+/)

1

vous pouvez fractionner une chaîne par saut de ligne à l'aide de l'instruction suivante:

 String textStr[] = yourString.split("\\r?\\n");

vous pouvez fractionner une chaîne par espace en utilisant l'instruction suivante:

String textStr[] = yourString.split("\\s+");


-1

Étudiez ce code .. bonne chance

    import java.util.*;
class Demo{
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        System.out.print("Input String : ");
        String s1 = input.nextLine();   
        String[] tokens = s1.split("[\\s\\xA0]+");      
        System.out.println(tokens.length);      
        for(String s : tokens){
            System.out.println(s);

        } 
    }
}

Pouvez-vous détailler votre réponse?
Stephan
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.