Java Language Fendre les cordes


Exemple

Vous pouvez fractionner une String sur un caractère de délimitation particulier ou une expression régulière , vous pouvez utiliser la méthode String.split() avec la signature suivante:

public String[] split(String regex)

Notez que le caractère de délimitation ou l'expression régulière sont supprimés du tableau de chaînes résultant.

Exemple utilisant un caractère de délimitation:

String lineFromCsvFile = "Mickey;Bolton;12345;121216";
String[] dataCells = lineFromCsvFile.split(";");
// Result is dataCells = { "Mickey", "Bolton", "12345", "121216"};

Exemple utilisant une expression régulière:

String lineFromInput = "What    do you need    from me?";
String[] words = lineFromInput.split("\\s+"); // one or more space chars
// Result is words = {"What", "do", "you", "need", "from", "me?"};

Vous pouvez même séparer directement un littéral String :

String[] firstNames = "Mickey, Frank, Alicia, Tom".split(", ");
// Result is firstNames = {"Mickey", "Frank", "Alicia", "Tom"};

Attention : n'oubliez pas que le paramètre est toujours traité comme une expression régulière.

"aaa.bbb".split("."); // This returns an empty array

Dans l'exemple précédent . est traité comme le caractère générique d'expression régulière qui correspond à n'importe quel caractère, et comme chaque caractère est un délimiteur, le résultat est un tableau vide.


Fractionnement basé sur un délimiteur qui est un méta-caractère regex

Les caractères suivants sont considérés comme spéciaux (aka méta-caractères) dans regex

  < > - = ! ( ) [ ] { } \ ^ $ | ? * + . 

Pour diviser une chaîne en fonction de l'un des délimiteurs ci-dessus, vous devez soit y échapper en utilisant \\ soit utiliser Pattern.quote() :

  • En utilisant Pattern.quote() :

     String s = "a|b|c";
     String regex = Pattern.quote("|");
     String[] arr = s.split(regex);
    
  • Fuyant les caractères spéciaux:

     String s = "a|b|c";
     String[] arr = s.split("\\|");
    

Split supprime les valeurs vides

split(delimiter) supprime par défaut les chaînes vides du tableau de résultats. Pour désactiver ce mécanisme, nous devons utiliser une version surchargée de split(delimiter, limit) avec une limite définie sur une valeur négative telle que

String[] split = data.split("\\|", -1);

split(regex) renvoie en interne le résultat du split(regex, 0) .

Le paramètre limit contrôle le nombre de fois où le motif est appliqué et affecte donc la longueur du tableau résultant.
Si la limite n est supérieure à zéro, alors le motif sera appliqué au maximum n - 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant.
Si n est négatif, le motif sera appliqué autant de fois que possible et le tableau pourra avoir n'importe quelle longueur.
Si n est égal à zéro, le modèle sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur et les chaînes vides à la fin seront supprimées.


Fractionnement avec un StringTokenizer

Outre la méthode split() , les chaînes peuvent également être divisées en utilisant un StringTokenizer .

StringTokenizer est encore plus restrictif que String.split() , et un peu plus difficile à utiliser. Il est essentiellement conçu pour extraire des jetons délimités par un ensemble fixe de caractères (donnés sous forme de String ). Chaque personnage agira comme un séparateur. A cause de cette restriction, il est environ deux fois plus rapide que String.split() .

Les jeux de caractères par défaut sont des espaces vides ( \t\n\r\f ). L'exemple suivant imprimera chaque mot séparément.

String str = "the lazy fox jumped over the brown fence";
StringTokenizer tokenizer = new StringTokenizer(str);
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

Cela va imprimer:

the
lazy 
fox 
jumped 
over 
the 
brown 
fence

Vous pouvez utiliser différents jeux de caractères pour la séparation.

String str = "jumped over";
// In this case character `u` and `e` will be used as delimiters 
StringTokenizer tokenizer = new StringTokenizer(str, "ue");
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

Cela va imprimer:

j
mp 
d ov
r