2010-09-24 6 views
3

Lorsque je divise la chaîne "1|2|3|4" en utilisant le , j'obtiens 8 éléments dans le tableau au lieu de 4. Si j'utilise "\\|" le résultat est correct. Je suppose que cela a quelque chose à faire avec les expressions régulières. Quelqu'un peut-il expliquer cela?Division d'une chaîne en Java

+0

Juste le fait remarquer - le temps que cette confusion a pris vous coûte probablement plus que vous économiserez en utilisant des expressions régulières (en plus de coder la fichue chose) pendant toute votre carrière à moins de faire beaucoup de scripts shell. –

+1

Je n'ai jamais eu l'intention d'utiliser des expressions régulières ... l'API damn utilise automatiquement .. que dois-je faire alors? –

+1

Malheureusement, la méthode 'String.split()' utilise toujours des regex. Cependant, il existe des API plus flexibles. – ColinD

Répondre

7

Vous avez raison. | est un caractère spécial pour l'alternance. L'expression régulière | signifie "une chaîne vide ou une chaîne vide". Donc, il va se diviser autour de toutes les chaînes vides, résultant de 1 élément pour chaque caractère de la chaîne. L'échapper \| en faire un caractère normal.

+0

Merci pour la réponse .. est & est aussi un personnage spécial? –

+0

@why: Non ce n'est pas le cas. Voir http://download-llnw.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html. Vous pouvez utiliser '\ Q ... \ E' pour vous assurer que le' ... 'ne sera pas interprété comme des caractères spéciaux. – kennytm

+0

@ pourquoi devrais-je vous dire mon nom: http://www.regular-expressions.info/reference.html – ColinD

1

| est OR dans la syntaxe Java expression régulière, le fractionnement essentiellement 1|2|3|4 avec | est égal à dire String#split() à « diviser cette chaîne entre vide ou vide) ce qui signifie qu'il se sépare après chaque personnage que vous avez dans la chaîne d'origine.

3

Si vous voulez diviser une chaîne sans utiliser une expression régulière, je recommande la classe Splitter de Guava. Il peut diviser sur les chaînes fixes, regexes et plus.

Iterable<String> split = Splitter.on('|').split("1|2|3|4");