2015-10-13 11 views
5

Ho questa stringa che sto prendendo da un file di testo.confuso come .split() funziona in Java

"1 normal 1 [(o, 21) (o, 17) (t, 3)]" 

Voglio prendere in 1, normal, 1, o, 21, 17, t, 3 in una matrice di stringhe.

Scanner inFile = new Scanner(new File("input.txt"); 
String input = inFile.nextLine(); 

String[] tokens = input.split(" |\\(|\\)|\\[\\(|\\, |\\]| \\("); 
    for(int i =0 ; i<tokens.length; ++i) 
    { 
     System.out.println(tokens[i]); 
    } 

uscita:

1 
normal 
1 

o 
21 


o 
17 


t 
3 

Perché ci sono gli spazi vengano memorizzati nella matrice.

risposta

0

Per esempio qui:

1 [(o 
  1. In un primo passo che corrisponda a un singolo spazio.
  2. Il passo successivo che corrisponda [(

Così tra questi due di corrispondenza, una stringa vuota "" viene restituito.

6

Questi non sono spazi, sono stringhe vuote. La stringa è:

"1 normal 1 [(o, 21) (o, 17) (t, 3)]" 

E 'diviso in questo modo secondo il vostro regexp:

Token = "1" 
Delimiter = " " 
Token = "normal" 
Delimiter = " " 
Token = "1" 
Delimiter = " " 
Token = "" <-- empty string 
Delimiter = "[(" 
Token = "o" 
... end so on 

Quando appaiono due delimitatori adiacenti, è considerato che c'è un token stringa vuota tra di loro.

Per risolvere questo problema è possibile modificare la regexp, per esempio, in questo modo:

"[ \\(\\)\\[\\,\\]]+" 

Così un numero qualsiasi di caratteri "()[,]" adiacenti saranno considerati come delimitatore.