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("-\\.");
}

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.


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.


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");

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 [].)


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);

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"}


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


3
String[] token=s.split("[.-]");

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.


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("-|\\.");
}

1

Essayez ce code:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

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.


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];
...

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.