2017-06-06 1 views
0

Considérons une chaîne comme ci-dessous avec le délimiteur __|__.String.split vs StringUtils.split en Java donne des résultats différents

String str = "a_b__|__c_d"; 

str.split("__\\|__") donne 2 splits A_B et C_D StringUtils.split(str, "__|__") or StringUtils.split(str, "__\\|__") donne 4 divise a, b, c, d, qui est non souhaité.

Est-il possible de faire StringUtils.split() pour donner les mêmes résultats String.split()?

+2

Utilisez StringUtils.splitByWholeSeparator à la place! – nCessity

Répondre

3

String.split() a une certaine sémantique very surprising, et c'est rarement ce que vous voulez. Vous devriez préférer StringUtils (ou Splitter de Guava, discuté dans le lien précédent).

Votre problème spécifique est que String.split() prend une expression régulière, tandis que StringUtils.split() utilise chaque caractère comme un jeton distinct. Vous devez utiliser StringUtils.splitByWholeSeparator() pour diviser le contenu de la chaîne complète.

StringUtils.splitByWholeSeparator(str, "__|__"); 
+0

Je recommande StringUtils.splitByWholeSeparatorPreserveAllTokens ("- a - b-", "-") -> ["", "a", "", "b", ""] qui correspond à l'éclatement de PHP ("-", " -a - b- ") -> [" "," a "," "," b "," "]. StringUtils.splitByWholeSeparator ("- a - b-", "-") renvoie ["a", "b", ""] que je trouve inattendu. –

+0

La sémantique PHP correspondante est, en général, probablement un anti-but;) – dimo414

1

Non, selon la documentation, le deuxième paramètre de StringUtils.split est la liste de tous les caractères considérés comme des séparateurs. Il existe une fonction différente dans Apache Commons qui fait ce que vous voulez - StringUtils.splitByWholeSeparator. Pourtant, je ne comprends pas ce qui ne va pas avec simple String.split.

+0

Merci. Je n'ai pas réalisé qu'une telle méthode existe. Eh bien, je peux utiliser String.split() mais je préfère StringUtils. splitByWholeSeparator() car il prend aussi des chaînes nulles. – user1013528