2012-02-15 20 views
31

Vorrei sostituire tutti '.' e ' ' con un '_'Stringa: come sostituire più caratteri possibili con un singolo carattere?

ma non mi piace il mio codice ...

c'è un modo più efficiente per farlo che:

String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".","_"); 

?

toLowerCase() proprio lì perché lo voglio in minuscolo così ...

+0

ah il mio codice non ha nemmeno funziona ... credo perché dice replaceAll utilizza espressioni regolari e così il '' è un problema – ycomp

risposta

60
String new_s = s.toLowerCase().replaceAll("[ .]", "_"); 

EDIT:

replaceAll sta usando le espressioni regolari, e l'utilizzo di . all'interno di una classe di caratteri [ ] solo riconosce a . piuttosto che a qualsiasi personaggio.

+0

Vale la pena ricordare che il metodo replaceAll riceve l'espressione regolare come primo argomento, consultare la documentazione: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html – MByD

+0

@BinyaminSharet , Grazie. – beny23

4

Utilizzare String#replace() anziché String#replaceAll(), non è necessario regex per la sostituzione di un solo carattere.

ho creato la seguente classe di verificare ciò che è più veloce, fare un tentativo:

public class NewClass { 

    static String s = "some_string with spaces _and underlines"; 
    static int nbrTimes = 10000000; 

    public static void main(String... args) { 

     long start = new Date().getTime(); 
     for (int i = 0; i < nbrTimes; i++) 
      doOne(); 
     System.out.println("using replaceAll() twice: " + (new Date().getTime() - start)); 



     long start2 = new Date().getTime(); 
     for (int i = 0; i < nbrTimes; i++) 
      doTwo(); 
     System.out.println("using replaceAll() once: " + (new Date().getTime() - start2)); 

     long start3 = new Date().getTime(); 
     for (int i = 0; i < nbrTimes; i++) 
      doThree(); 
     System.out.println("using replace() twice: " + (new Date().getTime() - start3)); 

    } 

    static void doOne() { 
     String new_s = s.toLowerCase().replaceAll(" ", "_").replaceAll(".", "_"); 
    } 

    static void doTwo() { 
     String new_s2 = s.toLowerCase().replaceAll("[ .]", "_"); 
    } 

    static void doThree() { 
     String new_s3 = s.toLowerCase().replace(" ", "_").replace(".", "_"); 
    } 
} 

ottengo il seguente output:

utilizzando replaceAll() due volte: 100274

utilizzando replaceAll() una volta: 24814

utilizzando replace() due volte: 31642

Ovviamente non ho profilato l'app per il consumo di memoria, che avrebbe potuto dare risultati molto diversi.

+0

sarebbe più efficiente usare replace ('', '_'). Replace ('.', '_') O regex codice come beny23 pubblicato? – ycomp

+0

Probabilmente è più efficiente usare 'replace()' a causa degli oggetti creati e della compilazione del Pattern. Ma per 'String's piccoli non importa molto ... solo se prevedi di usarlo su un loop o qualcosa del genere. – Marcelo

+0

ok grazie, questo mi aiuta a capire – ycomp

8

s.replaceAll("[\\s\\.]", "_")

Problemi correlati