2010-11-05 39 views
5

Tôi đang cố gắng thay thế chuỗi con chứa char "$". Tôi rất vui khi được biết tại sao nó không hoạt động theo cách đó, và nó hoạt động ra sao.Thay thế chuỗi con (replaceAll) workaround

Cảm ơn, user_unknown

public class replaceall { 
    public static void main(String args[]) { 
     String s1= "$foo - bar - bla"; 
     System.out.println("Original string:\n"+s1); 
     String s2 = s1.replaceAll("bar", "this works"); 
     System.out.println("new String:\n"+s2); 
     String s3 = s2.replaceAll("$foo", "damn"); 
     System.out.println("new String:\n"+s3); 
    } 

} 
+0

Và bản in này ra sao? '$ foo - cái này hoạt động - bla'? – Entity

+0

có thể trùng lặp của [vấn đề Backslash với String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell

Trả lời

14

Java's .replaceAll ngầm sử dụng Regex để thay thế. Điều đó có nghĩa là, $foo được hiểu là mẫu regex và $ là đặc biệt trong regex (có nghĩa là "kết thúc chuỗi").

Bạn cần phải thoát khỏi $ như

String s3 = s2.replaceAll("\\$foo", "damn"); 

nếu mục tiêu một biến, sử dụng Pattern.quote để thoát khỏi tất cả các ký tự đặc biệt trên Java ≥1.5, và nếu việc thay thế cũng là một biến, sử dụng Matcher.quoteReplacement.

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn")); 

Trên Java ≥1.5, bạn có thể use .replace instead.

String s3 = s2.replace("$foo", "damn"); 

Kết quả: http://www.ideone.com/Jm2c4

+1

Câu trả lời rất hay, nhưng IMHO bạn đang giải quyết vấn đề sai. –

+2

Cũng lưu ý rằng chuỗi thay thế cho 'replaceAll()' có thể cần phải thoát quá (với 'Pattern.quoteReplacement()'). – axtavt

+0

@axtavt: điểm tốt –

5

IIRC, replaceAll mất một regex: Cố gắng thoát khỏi $, theo cách này:

String s3 = s2.replaceAll("\\$foo", "damn"); 
9

Nếu bạn không cần chức năng Regex, không sử dụng các phiên bản regex.

Sử dụng String.replace(str, str) thay vì:

String s = "$$$"; 
String rep = s.replace("$", "€"); 
System.out.println(rep); 
// Output: €€€ 

tham khảo:

+1

+1 - Tôi đã chấp nhận câu trả lời này. replaceAll là để thay thế các kết quả trùng khớp của một mẫu, thay thế cho thay thế chuỗi char (chính xác là những gì chúng ta muốn ở đây) –

0
public static String safeReplaceAll(String orig, String target, String replacement) { 
    replacement = replacement.replace("$", "\\$"); 
    return orig.replaceAll(target, replacement); 
} 
Các vấn đề liên quan