Java Language Spaccare le corde


Esempio

È possibile dividere una String su un particolare carattere di delimitazione o un'espressione regolare , è possibile utilizzare il metodo String.split() con la seguente firma:

public String[] split(String regex)

Si noti che la delimitazione del carattere o dell'espressione regolare viene rimossa dalla matrice di stringhe risultante.

Esempio utilizzando il carattere di delimitazione:

String lineFromCsvFile = "Mickey;Bolton;12345;121216";
String[] dataCells = lineFromCsvFile.split(";");
// Result is dataCells = { "Mickey", "Bolton", "12345", "121216"};

Esempio usando l'espressione regolare:

String lineFromInput = "What    do you need    from me?";
String[] words = lineFromInput.split("\\s+"); // one or more space chars
// Result is words = {"What", "do", "you", "need", "from", "me?"};

Puoi anche dividere direttamente un valore letterale String :

String[] firstNames = "Mickey, Frank, Alicia, Tom".split(", ");
// Result is firstNames = {"Mickey", "Frank", "Alicia", "Tom"};

Avvertenza : non dimenticare che il parametro viene sempre considerato come un'espressione regolare.

"aaa.bbb".split("."); // This returns an empty array

Nell'esempio precedente . viene considerato come il carattere jolly di espressione regolare che corrisponde a qualsiasi carattere e poiché ogni carattere è un delimitatore, il risultato è un array vuoto.


Divisione basata su un delimitatore che è un meta-carattere regex

I seguenti personaggi sono considerati speciali (detti anche meta-caratteri) in espressioni regolari

  < > - = ! ( ) [ ] { } \ ^ $ | ? * + . 

Per dividere una stringa in base a uno dei delimitatori sopra indicati, è necessario Pattern.quote() l' escape usando \\ o utilizzare Pattern.quote() :

  • Utilizzando Pattern.quote() :

     String s = "a|b|c";
     String regex = Pattern.quote("|");
     String[] arr = s.split(regex);
    
  • Sfuggire ai caratteri speciali:

     String s = "a|b|c";
     String[] arr = s.split("\\|");
    

Split rimuove i valori vuoti

split(delimiter) per default rimuove le stringhe vuote finali dall'array dei risultati. Per disattivare questo meccanismo, è necessario utilizzare la versione di split(delimiter, limit) con limite impostato su valore negativo come

String[] split = data.split("\\|", -1);

split(regex) restituisce internamente il risultato di split(regex, 0) .

Il parametro limit controlla il numero di volte in cui il pattern è applicato e quindi influenza la lunghezza dell'array risultante.
Se il limite n è maggiore di zero, il pattern verrà applicato al massimo n - 1 volte, la lunghezza dell'array non sarà maggiore di n e l'ultima voce dell'array conterrà tutti gli input oltre l'ultimo delimitatore corrispondente.
Se n è negativo, il pattern verrà applicato il maggior numero possibile di volte e l'array può avere una lunghezza qualsiasi.
Se n è zero, il pattern verrà applicato il maggior numero di volte possibile, l'array può avere una lunghezza qualsiasi e le stringhe vuote verranno eliminate.


Divisione con StringTokenizer

Oltre al metodo split() , le stringhe possono anche essere suddivise usando StringTokenizer .

StringTokenizer è ancora più restrittivo di String.split() , e anche un po 'più difficile da usare. È essenzialmente progettato per estrarre token delimitati da un set fisso di caratteri (dati come String ). Ogni personaggio fungerà da separatore. A causa di questa restrizione, è circa il doppio della velocità di String.split() .

I set di caratteri predefiniti sono spazi vuoti ( \t\n\r\f ). L'esempio seguente stamperà ogni parola separatamente.

String str = "the lazy fox jumped over the brown fence";
StringTokenizer tokenizer = new StringTokenizer(str);
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

Questo verrà stampato:

the
lazy 
fox 
jumped 
over 
the 
brown 
fence

È possibile utilizzare diversi set di caratteri per la separazione.

String str = "jumped over";
// In this case character `u` and `e` will be used as delimiters 
StringTokenizer tokenizer = new StringTokenizer(str, "ue");
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

Questo verrà stampato:

j
mp 
d ov
r