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