2009-12-30 19 views
9

Come si imposta il delimitatore per uno scanner su entrambi; o nuova linea?Domanda scanner Java

Ho provato: Scanner.useDelimiter(Pattern.compile("(\n)|;")); Ma non funziona.

+0

Trovato l'errore, devo usare (\ r \ n) | ;. Stavo analizzando qualcosa del genere: string; numero \ r \ n ... e non ha richiesto qualcosa come 100 \ r come numero. – Razvi

risposta

15

Come regola generale, nei motivi, è necessario raddoppiare lo \.

Quindi, cercare

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));` 

o

Scanner.useDelimiter(Pattern.compile("[\\n;]"));` 

Edit: Se \r\n è il problema, si potrebbe desiderare di provare questo:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+")); 

che corrisponde uno o più di \r, \n e ;.

Nota: Non ho provato questi.

+1

Puoi andare in entrambi i modi. Se si usano due barre inverse, il compilatore regex vede '\ n' e lo interpreta come sequenza di escape per un avanzamento riga. Se si utilizza una barra rovesciata, il compilatore regex vede un carattere di avanzamento riga effettivo, che corrisponde letteralmente. Ma sicuramente sceglierei la versione della classe personaggio: '" [\\ n;] "' o '" [\ n;] "'; è più facile da leggere e più efficiente. –

+0

@Alan Moore: Ah, OK ... ho appena pensato che un'interruzione letterale sarebbe stata male interpretata. – Powerlord

1

Osservando il commento dell'OP, sembra che il problema sia stato un finale di riga diverso (\ r \ n o CRLF).

Ecco la mia risposta, che avrebbe gestire più punti e virgola e le terminazioni di linea sia in formato (può o non può desiderare)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+")); 

esempio un file di input che assomiglia a questo:

1 


2;3;;4 
5 

comporterebbe 1,2,3,4,5

ho provato normale \ n e \\ n - entrambi lavorato nel mio caso, anche se sono d'accordo se hai bisogno di una normale barra rovesciata, vorresti raddoppiarla perché è un personaggio di escape. In questo caso, "\ n" diventa il carattere desiderato con o senza l'extra '\'

9

Come hai scoperto, era necessario cercare i separatori di riga \r\n (CRLF) stile di rete/CRLF) invece dello stile Unix \n (solo LF). Ma cosa succede se il testo contiene entrambi? Succede molto; infatti, quando vedo la fonte di questa stessa pagina, vedo entrambe le varietà.

Si dovrebbe prendere l'abitudine di cercare entrambi i tipi di separatore, così come il vecchio stile Mac \r (solo CR). Ecco un modo per farlo:

\r?\n|\r 

Inserendo che nel codice di esempio si ottiene:

scanner.useDelimiter(";|\r?\n|\r"); 

Ciò presuppone che si desidera far corrispondere esattamente una nuova riga o punto e virgola alla volta.Se si desidera far corrispondere uno o più si può fare questo, invece:

scanner.useDelimiter("[;\r\n]+"); 

Si noti, inoltre, come ho passato in un stringa regex invece di un modello; tutte le regex vengono automaticamente memorizzate nella cache, quindi la pre-compilazione della regex non aumenta le prestazioni.