2012-02-15 46 views
31

Tôi muốn thay thế tất cả '.'' ' với một '_'Chuỗi: Cách thay thế nhiều ký tự có thể bằng một ký tự đơn?

nhưng tôi không thích mã của tôi ...

là có một cách hiệu quả hơn để làm điều này hơn:

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

?

toLowerCase() chỉ có bởi vì tôi muốn nó thấp-cased cũng ...

+0

ah mã của tôi thậm chí không làm việc ... tôi đoán vì nó nói replaceAll sử dụng biểu thức thông thường và do đó '' là một vấn đề – ycomp

Trả lời

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

EDIT:

replaceAll đang sử dụng biểu thức thông thường, và sử dụng . bên trong một lớp nhân vật [ ] chỉ công nhận a . thay vì bất kỳ ký tự nào.

+0

Điều đáng nói đến là phương thức replaceAll nhận biểu thức chính quy làm đối số đầu tiên, xem tài liệu: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html – MByD

+0

@BinyaminSharet , cảm ơn. – beny23

4

Sử dụng String#replace() thay vì String#replaceAll(), bạn không cần regex để thay thế một ký tự.

Tôi tạo ra lớp sau để kiểm tra những gì nhanh hơn, cung cấp cho nó một thử:

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

tôi nhận được kết quả như sau:

sử dụng replaceAll() hai lần: 100274

sử dụng replaceAll() một lần: 24814

sử dụng thay thế() hai lần: 31642

Tất nhiên tôi chưa lược tả ứng dụng để tiêu thụ bộ nhớ, điều đó có thể đã cho kết quả rất khác.

+0

sẽ hiệu quả hơn khi sử dụng thay thế ('', '_'). Thay thế ('.', '_') Hoặc mã regex như beny23 được đăng? – ycomp

+0

Nó có thể hiệu quả hơn để sử dụng 'replace()' vì các đối tượng được tạo ra và biên dịch của Pattern. Nhưng đối với chuỗi nhỏ, nó thực sự không quan trọng lắm ... chỉ khi bạn dự định sử dụng nó trên một vòng lặp hay cái gì đó. – Marcelo

+0

ok cảm ơn, giúp hiểu biết của tôi – ycomp

Các vấn đề liên quan