2012-05-25 3 views
6

Я использую replaceAll() в Groovy и попадаю, когда строка замены содержит символ $ (который интерпретируется как ссылка группы регулярных выражений). тамGroovy replaceAll где замена содержит символ доллара?

replaced = "$bar" 

ли лучше:

Я нахожу, что я должен сделать довольно уродливый двойную замену:

def regexpSafeReplacement = replacement.replaceAll(/\$/, '\\\\\\$') 
replaced = ("foo" =~ /foo/).replaceAll(regexpSafeReplacement) 

Где:

replacement = "$bar" 

И желаемый результат способ выполнения этой замены без промежуточного шага?

+0

Что ваша входная строка, и то, что выход Вы ожидаете? –

+0

Я уточнил вопрос –

ответ

8

Как говорится в docs for replaceAll, вы можете использовать Matcher.quoteReplacement

def input = "You must pay %price%" 

def price = '$41.98' 

input.replaceAll '%price%', java.util.regex.Matcher.quoteReplacement(price) 

также отметить, что вместо двойных кавычек в:

replacement = "$bar" 

Вы хотите использовать одиночные кавычки, как:

replacement = '$bar' 

Как иначе Groovy будет рассматривать его как шаблон и терпеть неудачу, когда он не найти недвижимость bar

Так, для примера:

import java.util.regex.Matcher 
assert '$bar' == 'foo'.replaceAll('foo', Matcher.quoteReplacement('$bar')) 
+0

Большое спасибо Тим, отлично работает –

+0

Как вы определяете файл для этой замены? –

0

В Gradle файлах заменить одиночные кавычки и двойной слэш:

'\\$bar' 
Смежные вопросы