Utilizzare String.split () con più delimitatori


201

Ho bisogno di dividere una base di stringa sul delimitatore -e .. Di seguito sono riportati i risultati desiderati.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

ma il mio codice seguente non funziona.

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

Sulla base di quello che hai detto, sembra che funzioni bene. Qual è l'output desiderato?
Jeff,

2
@Jeff: ha mostrato il risultato desiderato ( AA/ BB/ CC...)
TJ Crowder,

2
Sei sicuro? L'ho interpretato come il suo output attuale, non come l'output desiderato. Forse è il momento di alzarsi e camminare un po 'in giro.
Jeff,

@Jeff: scusami per la confusione, ho aggiornato il mio post per chiarire il tuo malinteso.
Thang Pham,

Regex peggiorerà le tue prestazioni. Consiglierei di scrivere un metodo che andrà carattere per carattere e dividere la stringa se necessario. È possibile ottimizzare questo ulteriore per ottenere le prestazioni del registro (n).
Princesh,

Risposte:


311

Penso che sia necessario includere l' operatore regex OR :

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

Quello che hai corrisponderà:
[DASH seguito da DOT insieme] -.
non
[DASH o DOT nessuno di essi] -o.


9
perché abbiamo bisogno di due barre rovesciate ??
pjain,

7
Il .carattere in regex indica qualsiasi carattere diverso da una nuova riga. tutorialspoint.com/java/java_regular_expressions.htm In questo caso, tuttavia, volevano il personaggio reale .. Le due barre rovesciate indicano che ti stai riferendo .. La barra rovesciata è un personaggio di fuga.
Monkeygrinder,

2
per casi normali sarebbe .split("match1|match2")(es. split("https|http")), \\ è sfuggire al carattere speciale .nel caso precedente
prayagupd

o in generale, puoi usare pdfName.split("\\W");come sotto la risposta
@Peter

1
usa [-.]invece di-|\\.
Saeed il

49

Prova questa regex "[-.]+". Il + dopo considera i caratteri delimitatori consecutivi come uno. Rimuovi plus se non lo desideri.


8
@Lurkers: L'unica ragione per cui Peter non ha dovuto fuggire -è che è il primo pensiero all'interno del [], altrimenti ci sarebbe bisogno di una barra rovesciata (e, naturalmente, per mettere una barra rovesciata davanti, noi ne servono due perché questa è una stringa letterale).
TJ Crowder,

Penso che questa risposta sia migliore di quella accettata, perché quando si utilizza l'operatore logico |, il problema è che uno dei delimitatori può far parte dei "token" del risultato. Questo non accadrà con il [-.] +
Jack di

26

È possibile utilizzare la regex "\ W". Questo corrisponde a qualsiasi carattere non di parole. La riga richiesta sarebbe:

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

non funziona per me `String s =" id (INT), name (STRING), ". L'uso di \\ W qui crea un array di lunghezza 6 dove dovrebbe essere solo 4
user3527975

2
Ciò si interromperà anche quando l'input contiene caratteri Unicode. È meglio includere solo il delimitatore effettivo, anziché un "prendi tutto" con \W.
nhahtdh,

13

La stringa che dai splitè la forma di stringa di un'espressione regolare, quindi:

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

Ciò significa dividere qualsiasi personaggio nel [](dobbiamo scappare -con una barra rovesciata perché è speciale all'interno []; e ovviamente dobbiamo scappare dalla barra rovesciata perché questa è una stringa). (Al contrario, .è normalmente speciale ma non è speciale all'interno [].)


In questo caso non è necessario sfuggire al trattino, perché [-.]non è possibile interpretarlo come intervallo.
Alan Moore,

1
@Alan: Perché è la prima cosa in classe, è vero. Ma lo faccio sempre, è troppo facile tornare più tardi e aggiungere qualcosa davanti senza pensarci. Fuggire non costa nulla, quindi ...
TJ Crowder,

sai come sfuggire alle parentesi? Ho String "[200] Engineering" che voglio dividere in "200", "Engineering"
scottysseus

3
Oh wow l'ho preso ... Ho dovuto usare due barre rovesciate anziché una. String[] strings = codes.get(x).split("\\[|\\]| ");<- codice per chiunque sia interessato
scottysseus il

13

Usando Guava puoi fare questo:

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

4

Per due sequenze di caratteri come delimitatori "AND" e "OR" questo dovrebbe essere lavorato. Non dimenticare di tagliare durante l'utilizzo.

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

Risultato: città = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


Come posso ottenere output come {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"}
Ahamadullah Saikat,

3

Vorrei usare Apache Commons:

importare org.apache.commons.lang3.StringUtils;

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

Si dividerà su uno qualsiasi dei separatori specificati, al contrario dei StringUtils.splitByWholeSeparator(str, separator)quali utilizza la stringa completa come separatore


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

9
Aiuta a combattere l'incomprensione secondo cui StackOverflow è un servizio di scrittura di codice gratuito, aumentando la tua risposta al solo codice con alcune spiegazioni.
Yunnosch,

2

È meglio usare qualcosa del genere:

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

Ho aggiunto alcuni altri caratteri come esempio. Questo è il modo più sicuro di usare, perché il modo .e 'viene trattato.


1

Puoi anche specificare un'espressione regolare come argomento nel metodo split () .. vedi sotto esempio ....

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

1

Prova questo codice:

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

1
Aiuta a combattere l'incomprensione secondo cui StackOverflow è un servizio di scrittura di codice gratuito, aumentando la tua risposta al solo codice con alcune spiegazioni.
Yunnosch,

0
s.trim().split("[\\W]+") 

dovrebbe funzionare.


2
In primo luogo, no, non funziona - forse puoi provarlo prima di pubblicare? Quindi questa risposta è uguale alla tua, ma funziona. Infine, dovresti controllare la tua formulazione ( dovrebbe funzionare. ).
Arriva l'

1
Aiuta a combattere l'incomprensione secondo cui StackOverflow è un servizio di scrittura di codice gratuito, aumentando la tua risposta al solo codice con alcune spiegazioni.
Yunnosch,

-1

Se sai che la puntura sarà sempre nello stesso formato, prima dividi la stringa in base .e memorizza la stringa nel primo indice in una variabile. Quindi dividere la stringa nel secondo indice in base a -e memorizzare gli indici 0, 1 e 2. Infine, dividere l'indice 2 dell'array precedente in base a .e si dovrebbe aver ottenuto tutti i campi pertinenti.

Fai riferimento al seguente frammento:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
Può essere fatto in un solo passaggio, quindi fallo in un solo passaggio. Vedi le altre risposte.
Kaj,

2
pdfName.split(".")risulta in un array di lunghezza zero.
Alan Moore,

1) .Deve essere evaso come\\.
Shri il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.