2013-01-16 20 views
7

Eventuali duplicati:
Replacing all non-alphanumeric characters with empty stringsrimuovere tutti i caratteri speciali in java

import java.util.Scanner; 
import java.util.regex.*; 
public class io{ 
public static void main(String args[]){ 
Scanner scan = new Scanner(System.in); 
String c; 
if((c=scan.nextLine())!=null) 
{ 
Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
Matcher match= pt.matcher(c); 
    while(match.find()){ 
     c=c.replace(Character.toString(c.charAt(match.start())),""); 
     } 
    System.out.println(c); 
     } 
    } 
} 

Caso 1

Input : hjdg$h&jk8^i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdgh&jk8^issh6 

Caso 2

Input : hjdgh&jk8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjk8i0ssh6 

Caso 3

Input : hjdgh&j&k8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjki0ssh6 

Chiunque ti prego, aiutami a capire, ciò che è sbagliato nella mia logica codice ??

+2

considerare guardando Java convenzioni di denominazione e formattare il codice sorgente prima di inviare la domanda. – rtheunissen

+0

Prova '[^ az $] | [^ AZ $] | [^ 0-9 $]' – noMAD

+0

@ paranoide-android in realtà, ho scritto il codice sopra sul blocco note .. :( – Ravi

risposta

15

uso [\\W+] o "[^a-zA-Z0-9]" come regex per abbinare caratteri speciali e anche utilizzare String.replaceAll (regex, String) per sostituire il charecter spl con una stringa vuota. ricorda come il primo argomento di String.replaceAll è una regex devi sfuggire a esso con una barra rovesciata per trattare em come un carattere letterale.

  String c= "hjdg$h&jk8^i0ssh6"; 
     Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
     Matcher match= pt.matcher(c); 
     while(match.find()) 
     { 
      String s= match.group(); 
     c=c.replaceAll("\\"+s, ""); 
     } 
     System.out.println(c); 
+0

'c = c.replace (match.group()," ");' anche questo funziona. Perché ?? – Ravi

+0

@var___ nota che ho usato replaceAll che prende i primi args come regex, mentre stai usando replace whihc non prendo regex, quindi funziona .. :) – PermGenError

+0

ok .. ho capito ora .. grazie !! – Ravi

9

È possibile leggere le linee e sostituire in modo sicuro tutti i caratteri speciali in questo modo.
Ricordare che se si utilizza \\W non si sostituiranno i caratteri di sottolineatura.

Scanner scan = new Scanner(System.in); 

while(scan.hasNextLine()){ 
    System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", ""); 
} 
+0

e se volessi usare il pacchetto 'regex'. – Ravi

+0

Beh, se si tratta di un compito e si deve usare il pacchetto' regex', allora si potrebbe considerare una soluzione inutilmente complessa. voglio usare il pacchetto 'regex'? – rtheunissen

+0

Quindi, che posso imparare di più su' reg ex' package – Ravi

2

Il tuo problema è che gli indici restituiti da match.start() corrispondono alla posizione del carattere come si presentava nella stringa originale quando si abbinato esso; tuttavia, ogni volta che riscrivi la stringa c, questi indici diventano errati.

L'approccio migliore per risolvere questo è quello di utilizzare replaceAll, ad esempio:

 System.out.println(c.replaceAll("[^a-zA-Z0-9]", "")); 
Problemi correlati