Заменить подстроку (replaceAll) временное решение - PullRequest
5 голосов
/ 05 ноября 2010

Я пытаюсь заменить подстроку, которая содержит символ "$".Я был бы рад услышать, почему это не работает таким образом и как это будет работать.

Спасибо, 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);
    }

}

Ответы [ 4 ]

14 голосов
/ 05 ноября 2010

Java .replaceAll неявно использует Regex для замены. Это означает, что $foo интерпретируется как шаблон регулярного выражения, а $ является специальным в регулярном выражении (что означает «конец строки»).

Вам нужно сбежать от $ как

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

если цель - переменная, используйте Pattern.quote для экранирования всех специальных символов в Java ≥1.5, а если замена также является переменной, используйте Matcher.quoteReplacement.

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

В Java ≥1.5 вы могли бы использовать .replace вместо .

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

Результат: http://www.ideone.com/Jm2c4

9 голосов
/ 05 ноября 2010

Если вам не нужна функциональность Regex, не используйте версию Regex.

Используйте String.replace(str, str) вместо:

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

Справка:

5 голосов
/ 05 ноября 2010

IIRC, замените все, возьмите регулярное выражение: попробуйте убежать от $, таким образом:

String s3 = s2.replaceAll("\\$foo", "damn");
0 голосов
/ 01 марта 2012
public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...