2012-02-15 120 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\\.]", "_")

相關問題