Comment diviser une chaîne par espace


329

J'ai besoin de diviser ma chaîne par des espaces. Pour cela, j'ai essayé:

str = "Hello I'm your String";
String[] splited = str.split(" ");

Mais cela ne semble pas fonctionner.


3
Semble bon ... quelles sont les valeurs dans le tableau «divisé»?
npinti

1
Votre code fonctionne en effet tel quel. Voir le code exécuté en direct sur IdeOne.com .
Basil Bourque

@BasilBourque - Je n'ai trouvé aucun bouton d'exécution sur ce lien
nanosoft

1
@nanosoft La page d'IdeOne.com s'exécute automatiquement lors du chargement. Voir la sortie sous le code, dans la section stdout . Pour modifier le code, cliquez sur le forklien dans le coin supérieur gauche.
Basil Bourque

Réponses:


639

Ce que vous avez devrait fonctionner. Si, cependant, les espaces fournis sont par défaut à ... autre chose? Vous pouvez utiliser l'expression rationnelle des espaces blancs:

str = "Hello I'm your String";
String[] splited = str.split("\\s+");

Cela entraînera un nombre illimité d'espaces consécutifs pour diviser votre chaîne en jetons.

En passant, je ne suis pas sûr que «divisé» soit un mot :) Je crois que l'état d'être victime d'une scission est également «scindé». C'est une de ces choses grammaticales délicates :-) N'essayant pas d'être pointilleux, je me suis dit que je le transmettrais!


45
Je suis suisse à quoi vous attendiez-vous, mon anglais n'est pas le meilleur; P, de toute façon ça a fonctionné!
safari du

29
:-) Hé ce n'est pas grand. J'ai utilisé des noms de variables ridicules (dans du code que je n'aurais probablement pas dû laisser aller en direct!) Je n'essayais pas d'être un grammaire nazi ou quoi que ce soit, juste en passant un petit anecdote, c'est tout.
corsiKa

7
@Safari, vous venez de recevoir 2 bons conseils au prix de 1. je plaisante. Très bonne réponse.
Nirmal Mangal

8
"Ce que vous avez devrait fonctionner" je dis quelque chose de similaire assez souvent lorsque mon code casse.
Griffin

1
Je trouve cela utile car mon cas d'utilisation était de diviser la chaîne et de supprimer plusieurs espaces. Une ligne de code fait les deux pour moi.
Niharika Upadhyay

87

Bien que la réponse acceptée soit bonne, sachez que vous vous retrouverez avec une chaîne vide de début si votre chaîne d'entrée commence par un espace blanc. Par exemple, avec:

String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");

Le résultat sera:

splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";

Donc, vous voudrez peut-être couper votre chaîne avant de la diviser:

String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");

[Éditer]

En plus de la trimmise en garde, vous voudrez peut-être considérer le caractère d'espace insécable unicode ( U+00A0). Ce caractère s'imprime comme un espace régulier dans une chaîne et se cache souvent dans du texte copié-collé à partir d'éditeurs de texte enrichi ou de pages Web. Ils ne sont pas gérés par .trim()quels tests les caractères doivent être supprimés en utilisant c <= ' '; \sne les attrapera pas non plus.

Au lieu de cela, vous pouvez utiliser \p{Blank}mais vous devez également activer la prise en charge des caractères Unicode, ce que le normal splitne fera pas. Par exemple, cela fonctionnera: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words)mais cela ne fera pas la trimpartie.

Ce qui suit illustre le problème et fournit une solution. Il est loin d'être optimal de s'appuyer sur l'expression régulière pour cela, mais maintenant que Java a une représentation d'octets 8 bits / 16 bits, une solution efficace pour cela devient assez longue.

public class SplitStringTest
{
    static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}$", UNICODE_CHARACTER_CLASS);
    static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS);

    public static String[] trimSplitUnicodeBySpace(String str)
    {
        Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
        boolean ignore = trimMatcher.matches(); // always true but must be called since it does the actual matching/grouping
        return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
    }

    @Test
    void test()
    {
        String words = " Hello I'm\u00A0your String\u00A0";
        // non-breaking space here --^ and there -----^

        String[] split = words.split(" ");
        String[] trimAndSplit = words.trim().split(" ");
        String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
        String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);

        System.out.println("words: [" + words + "]");
        System.out.println("split: [" + Arrays.stream(split).collect(Collectors.joining("][")) + "]");
        System.out.println("trimAndSplit: [" + Arrays.stream(trimAndSplit).collect(Collectors.joining("][")) + "]");
        System.out.println("splitUnicode: [" + Arrays.stream(splitUnicode).collect(Collectors.joining("][")) + "]");
        System.out.println("trimAndSplitUnicode: [" + Arrays.stream(trimAndSplitUnicode).collect(Collectors.joining("][")) + "]");
    }
}

Résulte en:

words: [ Hello I'm your String ]
split: [][Hello][I'm your][String ]
trimAndSplit: [Hello][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]

29

Je crois que mettre une expression régulière entre les parenthèses str.split devrait résoudre le problème. La méthode Java String.split () est basée sur des expressions régulières donc ce dont vous avez besoin est:

str = "Hello I'm your String";
String[] splitStr = str.split("\\s+");

12

Utilisez Stringutils.split()pour diviser la chaîne par des blancs. Par exempleStringUtils.split("Hello World") renvoie "Bonjour" et "Monde";

Afin de résoudre le cas mentionné, nous utilisons une méthode de partage comme celle-ci

String split[]= StringUtils.split("Hello I'm your String");

lorsque nous imprimons le tableau divisé, la sortie sera:

Bonjour

je suis

votre

Chaîne

Pour un exemple complet de démonstration, cliquez ici



6

si vous ne voulez pas utiliser la méthode de partage de chaîne, vous pouvez utiliser la classe StringTokenizer en Java comme ..

    StringTokenizer tokens = new StringTokenizer("Hello I'm your String", " ");
    String[] splited = new String[tokens.countTokens()];
    int index = 0;
    while(tokens.hasMoreTokens()){
        splited[index] = tokens.nextToken();
        ++index;
    }

Il existe une possibilité de lever l'exception ArrayIndexOutofBounds.
Ajay Takur

2
Non, cela ne lancera pas "ArrayIndexOutofBounds" car j'ai déclaré la taille du tableau en fonction du nombre de jetons trouvés dans String. cela garantira que la taille des tableaux ne sera pas supérieure aux jetons reçus dans une chaîne.
Muhammad Suleman

6

Essaye celui-là

    String str = "This is String";
    String[] splited = str.split("\\s+");

    String split_one=splited[0];
    String split_second=splited[1];
    String split_three=splited[2];

   Log.d("Splited String ", "Splited String" + split_one+split_second+split_three);

4

Une autre solution serait:

import java.util.regex.Pattern;

...

private static final Pattern SPACE = Pattern.compile(" ");
String[] arr = SPACE.split(str); // str is the string to be split

Je l'ai vu ici


3

OK, nous devons donc faire le fractionnement car vous avez déjà obtenu la réponse, je la généraliserais.

Si vous souhaitez diviser une chaîne par des espaces, délimitez (caractères spéciaux).

Tout d'abord, supprimez l'espace de tête car ils créent la plupart des problèmes.

str1 = "    Hello I'm your       String    ";
str2 = "    Are you serious about this question_  boy, aren't you?   ";

Retirez d'abord l'espace de tête qui peut être de l'espace, des tabulations, etc.

String s = str1.replaceAll("^\\s+","");//starting with whitespace one or more

Maintenant, si vous voulez diviser par espace ou par n'importe quel caractère spécial.

String[] sa = s.split("[^\\w]+");//split by any non word char

Mais comme w contient [a-zA-Z_0-9], donc si vous voulez diviser par un trait de soulignement (_), utilisez également

 String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space

Cela replaceAll("^\\s+","")m'a sauvé la journée. Cela a fonctionné pour mon cas. Merci
Kostas Asargiotakis

2

Exemple très simple ci-dessous:

J'espère que ça aide.

String str = "Hello I'm your String";
String[] splited = str.split(" ");
var splited = str.split(" ");
var splited1=splited[0]; //Hello
var splited2=splited[1]; //I'm
var splited3=splited[2]; //your
var splited4=splited[3]; //String

1

vous pouvez réduire la chaîne en utilisant le code ci-dessous

   String thisString="Hello world";

   String[] parts = theString.split(" ");

   String first = parts[0];//"hello"

    String second = parts[1];//"World"

0

Voici une méthode pour couper une chaîne qui a un espace "," ou blanc

private String shorterName(String s){
        String[] sArr = s.split("\\,|\\s+");
        String output = sArr[0];

        return output;
    }

0

Comme cela fait un moment que ces réponses n'ont pas été publiées, voici une autre façon plus actuelle de faire ce qui est demandé:

List<String> output = new ArrayList<>();
try (Scanner sc = new Scanner(inputString)) {
    while (sc.hasNext()) output.add(sc.next());
}

Vous avez maintenant une liste de chaînes (ce qui est sans doute meilleur qu'un tableau); si vous avez besoin d'un tableau, vous pouvez le faireoutput.toArray(new String[0]);


0

Non seulement l'espace blanc, mais ma solution résout également les caractères invisibles.

str = "Hello I'm your String";
String[] splited = str.split("\p{Z}");

-1

Chaîne simple à cracher par espace

    String CurrentString = "First Second Last";
    String[] separated = CurrentString.split(" ");

    for (int i = 0; i < separated.length; i++) {

         if (i == 0) {
             Log.d("FName ** ", "" + separated[0].trim() + "\n ");
         } else if (i == 1) {
             Log.d("MName ** ", "" + separated[1].trim() + "\n ");
         } else if (i == 2) {
             Log.d("LName ** ", "" + separated[2].trim());
         }
     }
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.