Utilisez String.split () avec plusieurs délimiteurs

201

J'ai besoin de diviser une base de chaîne sur le délimiteur -et .. Voici ma 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("-\\.");
}
Thang Pham
la source
D'après ce que vous avez dit, il semble que cela fonctionne bien. Quelle est votre sortie souhaitée?
Jeff
2
@Jeff: Il a montré sa sortie souhaitée ( AA/ BB/ CC...)
TJ Crowder
2
Êtes-vous sûr? J'ai interprété cela comme sa sortie actuelle, pas sa sortie souhaitée. Peut-être qu'il est temps de se lever et de se promener un peu.
Jeff
@Jeff: Désolé pour la confusion, j'ai mis à jour mon message pour effacer votre malentendu.
Thang Pham,
Regex dégradera vos performances. Je recommanderais d'écrire une méthode qui ira caractère par caractère et divisera la chaîne si besoin. Vous pouvez optimiser cela pour obtenir les performances du journal (n).
Princesh

Réponses:

311

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

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

Ce que vous avez correspondra:
[DASH suivi de DOT ensemble] -.
pas
[DASH ou DOT aucun d'entre eux] -ou.

Richard H
la source
9
pourquoi nous avons besoin de deux barres obliques inverses ??
pjain
7
Le .caractère dans l'expression régulière signifie tout caractère autre que la nouvelle ligne. tutorialspoint.com/java/java_regular_expressions.htm Dans ce cas, cependant, ils voulaient le caractère réel .. Les deux barres obliques inverses indiquent que vous faites référence à .. La barre oblique inverse est un caractère d'échappement.
Monkeygrinder
2
pour les cas normaux, ce serait .split("match1|match2")(par exemple split("https|http")), \\ est d'échapper au caractère spécial .dans le cas ci-dessus
priagupd
ou en général, vous pouvez utiliser pdfName.split("\\W");comme ci-dessous @Peter Knego answer
ahmednabil88
1
utiliser [-.]au lieu de-|\\.
Saeed
49

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

Peter Knego
la source
8
@Lurkers: La seule raison pour laquelle Peter n'a pas eu à s'échapper, c'est -que c'est la première pensée à l'intérieur du [], sinon il devrait y avoir une barre oblique inverse devant (et bien sûr, pour mettre une barre oblique inverse devant, nous besoin de deux parce que c'est un littéral de chaîne).
TJ Crowder
Je pense que cette réponse est meilleure que celle acceptée, car lorsque vous utilisez l'opérateur logique |, le problème est que l'un de vos délimiteurs peut faire partie de votre résultat «jetons». Cela ne se produira pas avec [-.] +
Jack '
26

Vous pouvez utiliser l'expression régulière "\ W". Cela correspond à tout caractère autre qu'un mot. La ligne requise serait:

String[] tokens=pdfName.split("\\W");
Varun Gangal
la source
cela ne fonctionne pas pour moi `String s =" id (INT), name (STRING), ". L'utilisation de \\ W ici crée un tableau de longueur 6 alors qu'il ne devrait être que 4
user3527975
2
Cela se cassera également lorsque l'entrée contient du caractère Unicode. Il est préférable d'inclure uniquement le délimiteur réel, au lieu d'un "saisir tout" avec \W.
nhahtdh
13

La chaîne que vous donnez splitest la forme de chaîne d'une expression régulière, donc:

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

Cela signifie de diviser n'importe quel caractère dans le [](nous devons nous échapper -avec une barre oblique inverse parce que c'est spécial à l'intérieur []; et bien sûr, nous devons échapper à la barre oblique inverse parce que c'est une chaîne). (Inversement, .est normalement spécial mais n'est pas spécial à l'intérieur [].)

TJ Crowder
la source
Dans ce cas, vous n'avez pas besoin d'échapper au tiret, car [-.]il est impossible de l'interpréter comme une plage.
Alan Moore,
1
@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. S'échapper ne coûte rien, alors ...
TJ Crowder
savez-vous comment échapper aux crochets? J'ai la chaîne "[200] Engineering" que je veux diviser en "200", "Engineering"
scottysseus
3
Oh wow, je l'ai compris ... J'ai dû utiliser deux barres obliques inverses au lieu d'une. String[] strings = codes.get(x).split("\\[|\\]| ");<- code pour toute personne intéressée
scottysseus
13

En utilisant Guava, vous pouvez faire ceci:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);
ColinD
la source
4

Pour deux séquences de caractères en tant que délimiteurs "ET" et "OU" cela devrait être travaillé. N'oubliez pas de couper pendant l'utilisation.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Résultat: cities = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}

ÖMER TAŞCI
la source
Comment puis-je obtenir une sortie comme {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"}
Ahamadullah Saikat
3

J'utiliserais Apache Commons:

importer org.apache.commons.lang3.StringUtils;

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

Il se divisera sur l'un des séparateurs spécifiés, par opposition à celui StringUtils.splitByWholeSeparator(str, separator)qui utilise la chaîne complète comme séparateur

Edd
la source
3
String[] token=s.split("[.-]");
Nitish
la source
9
Aidez-nous à lutter contre le malentendu selon lequel StackOverflow est un service gratuit d'écriture de code, en augmentant votre réponse de code uniquement avec quelques explications.
Yunnosch
2

Il vaut mieux utiliser quelque chose comme ça:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

J'ai ajouté quelques autres personnages comme échantillon. C'est la façon la plus sûre d'utiliser, car la manière .et 'est traitée.

Pritam Banerjee
la source
1

Vous pouvez également spécifier l'expression régulière comme argument dans la méthode split () ..voir l'exemple ci-dessous ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}
Avdhesh Yadav
la source
1

Essayez ce code:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);
moissonneuse
la source
1
Aidez-nous à lutter contre le malentendu selon lequel StackOverflow est un service gratuit d'écriture de code, en augmentant votre réponse de code uniquement avec quelques explications.
Yunnosch
0
s.trim().split("[\\W]+") 

devrait marcher.

sss
la source
2
Tout d'abord, non, cela ne fonctionne pas - peut-être pouvez-vous l'essayer avant de poster? Ensuite, cette réponse est la même que votre - mais fonctionne. Enfin, vous devriez vérifier votre formatage ( devrait fonctionner. ).
Arount
1
Aidez-nous à lutter contre le malentendu selon lequel StackOverflow est un service gratuit d'écriture de code, en augmentant votre réponse de code uniquement avec quelques explications.
Yunnosch
-1

Si vous savez que la piqûre sera toujours dans le même format, divisez d'abord la chaîne en fonction de .et stockez la chaîne au premier index dans une variable. Ensuite, divisez la chaîne dans le deuxième index en fonction de -et stockez les index 0, 1 et 2. Enfin, divisez l'index 2 du tableau précédent en fonction de .et vous devriez avoir obtenu tous les champs pertinents.

Reportez-vous à l'extrait de code suivant:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...
isometrik
la source
6
Cela peut être fait en une seule étape, alors faites-le en une seule étape. Voir les autres réponses.
Kaj
2
pdfName.split(".")résulte en un tableau de longueur nulle.
Alan Moore
1) .Doit être échappé comme\\.
Shri