241 votes

Utilisez String.split() avec plusieurs délimiteurs

Je dois diviser une chaîne en fonction du délimiteur - et .. Voici la sortie souhaitée :

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

mais mon code suivant ne fonctionne pas.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

0 votes

Selon ce que vous avez dit, il semble que ça fonctionne bien. Quel est votre résultat souhaité?

3 votes

@Jeff : Il a montré sa sortie désirée (AA / BB / CC ...)

2 votes

Êtes-vous sûr? J'ai interprété cela comme sa sortie actuelle, pas sa sortie souhaitée. Peut-être est-il temps de se lever et de faire un peu de marche.

355voto

Richard H Points 11693

Je pense que vous devez inclure l'opérateur de regex OU:

String[]tokens = pdfName.split("-|\\.");

Ce que vous avez correspondra à:
[TIRET suivi de POINT ensemble] -.
et non
[TIRET ou POINT n'importe lequel d'entre eux] - ou .

11 votes

Pourquoi avons-nous besoin de deux barres obliques inverses ??

10 votes

Le caractère . en regex signifie tout caractère autre qu'un saut de ligne. tutorialspoint.com/java/java_regular_expressions.htm Dans ce cas, cependant, ils voulaient le caractère réel .. Les deux barres obliques indiquent que vous faites référence à .. La barre oblique inversée est un caractère d'échappement.

5 votes

Pour les cas normaux ce serait .split("match1|match2"), (par exemple split("https|http")), \\ est pour échapper le caractère spécial . dans le cas ci-dessus

67voto

Peter Knego Points 57985

Essayez cette expression régulière "[-.]+". Le + après traite les caractères délimiteurs consécutifs comme un seul. Retirez le plus si vous ne le souhaitez pas.

9 votes

@Lurkeurs: La seule raison pour laquelle Peter n'a pas eu à échapper ce - était que c'était la première chose à l'intérieur des crochets [], sinon il aurait fallu mettre un backslash devant (et bien sûr, pour mettre un backslash devant, nous avons besoin de deux parce que c'est une chaîne littérale).

2 votes

Je pense que cette réponse est meilleure que celle acceptée, car lorsque vous utilisez l'opérateur logique |, le problème est qu'un de vos délimiteurs peut faire partie de vos 'tokens' de résultat. Cela n'arrivera pas avec [-.] de Peter Knego.

31voto

Varun Gangal Points 81

Vous pouvez utiliser l'expression régulière "\W". Cela correspond à n'importe quel caractère qui n'est pas un mot. La ligne requise serait :

String[] tokens=pdfName.split("\\W");

0 votes

Ça ne marche pas pour moi ` String s = "id(INT), name(STRING),". En utilisant \\W ici crée un tableau de longueur 6 alors qu'il ne devrait y en avoir que 4

2 votes

Cela va également échouer lorsque l'entrée contient des caractères Unicode. Il est préférable d'inclure uniquement le délimiteur réel, au lieu d'un "tout attraper" avec \W.

16voto

ColinD Points 48573

En utilisant Guava, vous pourriez faire ceci :

Iterable tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

15voto

T.J. Crowder Points 285826

La chaîne que vous donnez à split est la chaîne sous forme d'expression régulière, donc:

private void getId(String pdfName){
    String[] tokens = pdfName.split("[-.]");
    // ...
}

Cela signifie "diviser sur n'importe quel caractère à l'intérieur des []" (donc, diviser sur - et .). Quelques remarques à ce sujet:

  1. Normalement, vous devez échapper le point (.) en mettant un antislash devant car dans une expression régulière, . signifie "n'importe quel caractère." Mais vous n'avez pas à le faire à l'intérieur d'une classe de caractères ([]).
  2. Normalement, à l'intérieur d'une classe de caractères ([]), vous devez échapper le tiret (-) car dans ce contexte il a une signification particulière (il indique une plage, comme [0-9A-Fa-f] pour correspondre à tous les chiffres hexadécimaux). Mais quand c'est le premier caractère après le [, nous n'avons pas à l'échapper.

Si vous deviez échapper l'un de ces caractères, la manière de le faire serait d'avoir un antislash devant dans la chaîne. Comme nous écrivons ceci sous forme de chaîne littérale, pour réellement mettre un antislash dans la chaîne, il faut l'échapper, sinon c'est un caractère d'échappement (par exemple, \n signifie saut de ligne, \t signifie tabulation, etc.). Donc nous devrions écrire \\ pour mettre réellement un antislash dans la chaîne pour que le moteur d'expression régulière le voie et l'utilise pour échapper le prochain caractère (- ou .). Par exemple, "[\\-.]" si nous voulions échapper le - même si ce n'est pas nécessaire.

Exemple en direct: https://ideone.com/PMA8d3

0 votes

Vous n'avez pas besoin d'échapper le trait d'union dans ce cas, car [-.] ne pourrait pas être interprété comme une plage.

1 votes

@Alan: Parce que c'est la toute première chose dans la classe, c'est tout à fait vrai. Mais je le fais toujours, c'est trop facile de revenir plus tard et d'ajouter quelque chose devant sans réfléchir. Le mettre en évidence ne coûte rien, donc...

0 votes

Savez-vous comment échapper aux crochets? J'ai la chaîne "[200] Engineering" que je veux diviser en "200", "Engineering"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X