2014-10-08 4 views
0

Я использовал String.replaceAll(String, String), когда заметил, что замена строки символами $ вокруг не будет работать. Пример $REPLACEME$ не будет заменен в системе Linux. Кто-нибудь знает, почему это?Java replaceAll

Некоторый код:

String foo = "Some string with $REPLACEME$"; 
foo = foo.replaceAll("$REPLACEME$", "characters"); 
System.out.println(foo); 

Выход:

Some string with $REPLACEME$ 
+2

Почему вы используете 'replaceAll', а не' replace'? Вам нужны * регулярные выражения? –

ответ

5

$ это специальный символ, который должен быть экранированы:

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 

Или в более общем случае использовать Pattern.quote, который избежит все метасимволы (специальные символы, такие как $ и ?) в строковые литералы:

foo = foo.replaceAll(Pattern.quote("$REPLACEME$"), "characters"); 
+0

Зачем нужно бежать? – TameHog

+2

Это означает конец строки в [синтаксисе регулярных выражений] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html). Поэтому, если у вас нет конца строки в начале вашей строки ... –

+3

+1 для 'Pattern.quote', я уже рассматривал ответ. –

3

replaceAll использует регулярное выражение в качестве первого аргумента. $ это якорь символ, который соответствует концу согласующих строк в регулярном выражении, так должен быть экранированы

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 
+1

Я бы также добавил, что в чистом регулярном выражении буквенный знак доллара должен быть экранирован' \ $ ', но в Java escape-символ должен быть экранирован, следовательно,' \\ $ '. – Gary

3

Метод replaceAll использует regular expressions и $ характера метасимвол в регулярном выражении, что представляет собой конец строка. Однако метод replace также заменяет все экземпляры целевой строки заменяющей строкой и использует обычную строку, а не регулярное выражение. Это сделает то, что вы ожидаете:

String foo = "Some string with $REPLACEME$"; 
foo = foo.replace("$REPLACEME$", "characters"); 
System.out.println(foo);