2012-02-15 93 views
31

我想换掉所有带有'_'字符串:如何用单个字符替换多个可能的字符?

'.'' ',但我不喜欢我的代码...

有没有更有效的方法来做到这一点比:

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

toLowerCase()就在那里,因为我希望它小写,以及...

+0

啊我的代码,甚至没有工作...我猜是因为它说的replaceAll使用正则表达式等等“”是一个问题 – ycomp 2012-02-15 15:01:23

回答

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

编辑:

replaceAll使用正则表达式,并使用.字符类[ ]刚认识内部一个.而不是任何字符。

+0

值得一提的是,replaceAll方法接收正则表达式作为第一个参数,请参阅文档:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html – MByD 2012-02-15 15:02:26

+0

@BinyaminSharet , 谢谢。 – beny23 2012-02-15 15:15:36

4

使用String#replace()而不是String#replaceAll(),您不需要单字符替换的正则表达式。

我创建了下面的类来测试什么是速度更快,不妨一试:使用100274

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

我得到以下输出:

使用的replaceAll()两次replaceAll()once:24814

使用replace()两次:31642

当然,我还没有分析应用程序的内存消耗,可能会给出非常不同的结果。

+0

使用replace('','_')。replace('。','_')还是像beny23发布的regex代码会更高效? – ycomp 2012-02-15 15:03:25

+0

由于创建了对象和模式的编译,使用'replace()'可能更高效。但对于小字符串来说,只要你打算在循环或其他东西上使用它,真的没什么关系。 – Marcelo 2012-02-15 15:07:04

+0

好的谢谢,这有助于我的理解 – ycomp 2012-02-15 15:11:33

8

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

相关问题