2012-02-15 9 views
31

me gustaría reemplazar todo '.' y ' ' con un '_'Cadena: cómo reemplazar múltiples caracteres posibles con un solo carácter?

pero no me gusta mi código ...

hay una manera más eficiente de hacerlo que:

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

?

toLowerCase() justo allí porque lo quiero más baja con carcasa así ...

+0

ah mi código ni siquiera funciona ... supongo que porque dice replaceAll utiliza expresiones regulares y por lo que el '' es un problema – ycomp

Respuesta

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

EDIT:

replaceAll está utilizando expresiones regulares, y el uso de . dentro de una clase de caracteres [ ] solo reconoce un . en lugar de cualquier personaje.

+0

Vale la pena mencionar que el método replaceAll recibe expresión regular como primer argumento, consulte la documentación: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html – MByD

+0

@BinyaminSharet , Gracias. – beny23

4

Use String#replace() en lugar de String#replaceAll(), no necesita regex para el reemplazo de un solo carácter.

creé la siguiente clase para probar lo que es más rápido, darle una oportunidad:

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(".", "_"); 
    } 
} 

me sale el siguiente resultado:

usando replaceAll() dos veces: 100274

usando replaceAll() una vez: 24814

utilizando replace() dos veces: 31642

Por supuesto, no he perfilado la aplicación para el consumo de memoria, que podría haber dado resultados muy diferentes.

+0

¿Sería más eficiente usar replace ('', '_'). Replace ('.', '_') O código regex como beny23? – ycomp

+0

Probablemente sea más eficiente usar 'replace()' debido a los objetos creados y la compilación del patrón. Pero para los pequeños 'String's realmente no importa tanto ... solo si planeas usarlo en un loop o algo así. – Marcelo

+0

ok gracias, eso ayuda a mi comprensión – ycomp

8

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

Cuestiones relacionadas