J'aime l'idée de StringTokenizer car elle est énumérable.
Mais il est également obsolète et remplacé par String.split qui retourne un String [] ennuyeux (et n'inclut pas les délimiteurs).
J'ai donc implémenté un StringTokenizerEx qui est un Iterable, et qui prend une vraie expression rationnelle pour diviser une chaîne.
Une expression rationnelle vraie signifie qu'il ne s'agit pas d'une 'séquence de caractères' répétée pour former le délimiteur:
'o' ne correspondra qu'à 'o' et divisera 'ooo' en trois délimiteurs, avec deux chaînes vides à l'intérieur:
[o], '', [o], '', [o]
Mais l'expression régulière o + renverra le résultat attendu lors de la division de "aooob"
[], 'a', [ooo], 'b', []
Pour utiliser ce StringTokenizerEx:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
Le code de cette classe est disponible sur DZone Snippets .
Comme d'habitude pour une réponse de défi de code (une classe autonome avec cas de test inclus), copiez-collez-la (dans un répertoire 'src / test') et exécutez-la . Sa méthode main () illustre les différents usages.
Remarque: (édition fin 2009)
L'article Réflexions finales: Java Puzzler: Splitting Hairs explique bien le comportement bizarre de String.split()
.
Josh Bloch a même commenté en réponse à cet article:
Oui, c'est pénible. FWIW, cela a été fait pour une très bonne raison: la compatibilité avec Perl.
Le gars qui l'a fait est Mike "madbot" McCloskey, qui travaille maintenant avec nous chez Google. Mike s'est assuré que les expressions régulières de Java passaient pratiquement tous les tests d'expression régulière de 30K Perl (et s'exécutaient plus rapidement).
La bibliothèque commune Google Guava contient également un Splitter qui est:
- plus simple à utiliser
- maintenu par Google (et non par vous)
Il peut donc être utile de vérifier. D'après leur documentation initiale (pdf) :
JDK a ceci:
String[] pieces = "foo.bar".split("\\.");
C'est bien de l'utiliser si vous voulez exactement ce qu'il fait: - expression régulière - résultat sous forme de tableau - sa façon de gérer les pièces vides
Mini-puzzler: ", a ,, b,". Split (",") renvoie ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Réponse: (e) Aucune des réponses ci-dessus.
",a,,b,".split(",")
returns
"", "a", "", "b"
Seuls les vides de fin sont ignorés! (Qui connaît la solution pour éviter le saut? C'est amusant ...)
Dans tous les cas, notre Splitter est simplement plus flexible: le comportement par défaut est simpliste:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Si vous voulez des fonctionnalités supplémentaires, demandez-les!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
L'ordre des méthodes de configuration n'a pas d'importance - pendant le fractionnement, le découpage a lieu avant de rechercher les vides.