2016-01-13 10 views
6

Ho un file test.txt contenente diverse linee, ad esempio, come ad esempio:Divisione stringa Java su alfanumerico e nuove linee?

"h3llo, @my name is, bob! (how are you?)" 

"i am [email protected]@@@@" 

voglio dividere tutti i caratteri alfanumerici e la nuova linea in un ArrayList in modo che il risultato sarebbe

output = ["h", "llo", "my", "name", "is", "bob", "how", "are", "you", "i", "am", "fine"] 

in questo momento, ho cercato dividere il mio testo con

output.split("\\P{Alpha}+") 

Ma per qualche ragione questo sembra aggiungere una virgola nel primo posto nella ArrayList, e ri pone la nuova riga con una stringa vuota

output = ["", "h", "llo", "my", "name", "is", "bob", "how", "are", "you", "", "i", "am", "fine"] 

C'è un altro modo per risolvere questo problema? Grazie!

-

EDIT: Come posso fare in modo che ignora la nuova linea?

+0

alfanumerica o solo Alpha? –

+0

perché 'hllo' dovrebbe essere un token nell'output, ma spogliato di' 3'? –

+0

@sashok_bg alfanumerico – evelyn

risposta

0

Usa la tua espressione regolare, inserisci il risultato in un ArrayList (dato che è quello che vuoi inserire i dati alla fine in ogni caso), quindi usa semplicemente removeIf per rimuovere le stringhe vuote.

String input = "\"h3llo, @my name is, bob! (how are you?)\"\n\n\"i am [email protected]@@@@\""; 

ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(input.split("\\P{Alpha}+"))); 
arrayList.removeIf(""::equals); 

System.out.println(arrayList); 

Risultato:

[h, llo, il mio, nome, è, bob, come, sono, si, io son, fine]

2

String.split() comportamento di Java è abbastanza confuso. Un'utilità di suddivisione molto migliore è Splitter . La loro documentation va più nel dettaglio i problemi con String.split():

il costruito nel utilità Java per suddividere stringhe possono avere alcuni comportamenti eccentrici. Ad esempio, String.split elimina automaticamente i separatori finali e StringTokenizer rispetta esattamente cinque caratteri di spazi bianchi e nient'altro.

Quiz: ",a,,b,".split(",") ritorna ...

  1. "", "a", "", "b", ""
  2. null, "a", null, "b", null
  3. "a", null, "b"
  4. "a", "b"
  5. Nessuno di quanto sopra

La risposta corretta è nessuna delle precedenti: "", "a", "", "b". Vengono saltate solo le stringhe vuote finali. Cos'è che non faccio nemmeno io.

Nel tuo caso questo dovrebbe funzionare:

Splitter.onPattern("\\P{Alpha}+").omitEmptyStrings().splitToList(output); 
+0

In particolare 'omitEmptyStrings()' sarebbe utile qui. –

0

Un'altra soluzione è quella di utilizzare il pacchetto regex in java.util.regex.*

Comprende Matcher e Pattern.

String input = "h3llo, @my name is, bob! (how are you?)\n"+ 
      "i am [email protected]@@@@"; 

    Pattern p = Pattern.compile("([a-zA-Z]+)"); 
    Matcher m = p.matcher(input); 

    List<String> tokens = new ArrayList<String>(); 
    while (m.find()) { 
     System.out.println("Found a " + m.group()); 
     tokens.add(m.group()); 
    } 

P.S Un buon strumento per testare il vostro modello di espressione regolare è https://regex101.com/

Problemi correlati