Les méthodes de fractionnement Java et Scala fonctionnent en deux étapes comme ceci:
- Commencez par diviser la chaîne par un délimiteur. La conséquence naturelle est que si la chaîne ne contient pas le délimiteur, un tableau singleton contenant uniquement la chaîne d'entrée est renvoyé,
- Deuxièmement, supprimez toutes les chaînes vides les plus à droite. C'est la raison pour laquelle
",,,".split(",")
renvoie un tableau vide.
Selon cela, le résultat de "".split(",")
devrait être un tableau vide à cause de la deuxième étape, non?
Cela devrait. Malheureusement, il s'agit d'un boîtier d'angle introduit artificiellement. Et c'est mauvais, mais au moins c'est documenté dans java.util.regex.Pattern
, si vous vous souvenez de jeter un œil à la documentation:
Pour n == 0, le résultat est comme pour n <0, sauf que les chaînes vides de fin ne seront pas renvoyées. (Notez que le cas où l'entrée est elle-même une chaîne vide est spécial, comme décrit ci-dessus, et le paramètre limit ne s'applique pas là.)
Solution 1: passez toujours -1 comme deuxième paramètre
Donc, je vous conseille de toujours passer n == -1
comme deuxième paramètre (cela sautera l'étape deux ci-dessus), à moins que vous ne sachiez spécifiquement ce que vous voulez réaliser / vous êtes sûr que la chaîne vide n'est pas quelque chose que votre programme obtiendrait en entrée.
Solution 2: utilisez la classe Guava Splitter
Si vous utilisez déjà Guava dans votre projet, vous pouvez essayer la classe Splitter (documentation) . Il possède une API très riche et rend votre code très facile à comprendre.
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"