2013-09-16 7 views
41

Sto cercando di ottenere una frase utilizzando l'input dell'utente in Java, e ho bisogno di renderla in minuscolo e rimuovere tutti i segni di punteggiatura. Ecco il mio codice:Come posso rimuovere la punteggiatura dal testo di input in Java?

String[] words = instring.split("\\s+"); 
    for (int i = 0; i < words.length; i++) { 
     words[i] = words[i].toLowerCase(); 
    } 
    String[] wordsout = new String[50]; 
    Arrays.fill(wordsout,""); 
    int e = 0; 
    for (int i = 0; i < words.length; i++) { 
     if (words[i] != "") { 
      wordsout[e] = words[e]; 
      wordsout[e] = wordsout[e].replaceAll(" ", ""); 
      e++; 
     } 
    } 
    return wordsout; 

Non riesco a trovare alcun modo per rimuovere tutti i caratteri non lettera. Ho provato a usare regex e iterators senza fortuna. Grazie per qualsiasi aiuto.

risposta

75

Questa prima rimuove tutti i caratteri non lettera, pieghe in lettere minuscole, quindi divide l'ingresso, facendo tutto il lavoro in una sola riga:

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+"); 

Gli spazi sono inizialmente lasciati in ingresso in modo la scissione sarà ancora lavoro.

Rimuovendo i caratteri della spazzatura prima della divisione, si evita di dover scorrere tra gli elementi.

+32

Se l'obiettivo è rimuovere la punteggiatura, non sarebbe "replaceAll (" \\ p {P} "," ")' più sensato? – VGR

+0

@VGR basato sul titolo sì, ma OP chiarisce in questione * rimuove tutti i caratteri non lettera * – Bohemian

+1

"å" è una lettera? Dal momento che quel personaggio sarebbe stato rimosso. –

2

Si può provare questo: -

Scanner scan = new Scanner(System.in); 
System.out.println("Type a sentence and press enter."); 
String input = scan.nextLine(); 
String strippedInput = input.replaceAll("\\W", ""); 
System.out.println("Your string: " + strippedInput); 

[^\w] corrisponde a un carattere non-parola, in modo che il sopra espressione regolare corrisponderà e rimuovere tutti i caratteri non-parola.

+0

Questo non sostituirà cifre. Quale immagino viene sotto non-lettera. –

+1

@RohitJain: - Sì, ho capito. Ma ho pensato alla punteggiatura che spesso usavamo nel linguaggio. Ho preso il significato letterale della punteggiatura !!! –

+0

Non è colpa tua. La domanda OP non è chiara al riguardo. –

3

Se non si desidera utilizzare RegEx (che sembra altamente superfluo dato il vostro problema), forse si dovrebbe provare qualcosa di simile:

public String modified(final String input){ 
    final StringBuilder builder = new StringBuilder(); 
    for(final char c : input.toCharArray()) 
     if(Character.isLetterOrDigit(c)) 
      builder.append(Character.isLowerCase(c) ? c : Character.toLowerCase(c)); 
    return builder.toString(); 
} 

Esso scorre sottostante char[] nelle String e solo accodamento il char se si tratta di una lettera o di una cifra (che esclude tutti i simboli, che presumo sia ciò che si sta tentando di ottenere) e quindi aggiunge la versione minuscola dello char.

+7

Nessuno ha mai risparmiato tempo non imparando le espressioni regolari – slater

0

Non mi piace usare regex, quindi ecco un'altra soluzione semplice.

public String removePunctuations(String s) { 
    String res = ""; 
    for (Character c : s.toCharArray()) { 
     if(Character.isLetterOrDigit(c)) 
      res += c; 
    } 
    return res; 
} 

Nota: Questo includerà entrambe le lettere e cifre

Problemi correlati