2012-05-25 7 views
6

Używam replaceAll() w Groovy i otrzymuję złapany, gdy zastępczy ciąg znaków zawiera symbol $ (co jest interpretowane jako odniesienie do grupy regexp).Groovy replaceAll gdzie zastąpienie zawiera symbol dolara?

jestem znalezienie muszę zrobić dość brzydki podwójne Zamiennik:

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

Gdzie:

replacement = "$bar" 

i pożądanym wynikiem jest:

replaced = "$bar" 

Czy istnieje lepszy sposób wykonania tego zamiennika bez pośredniego kroku?

+0

Jaki jest Twój ciąg wejściowy i wyjściowy, co czy oczekujesz? –

+0

Wyjaśniłem pytanie –

Odpowiedz

8

Jak mówi w docs for replaceAll, można użyć Matcher.quoteReplacement

def input = "You must pay %price%" 

def price = '$41.98' 

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

Należy również zauważyć, że zamiast cudzysłowia w:

replacement = "$bar" 

chcesz używać apostrofów jak:

replacement = '$bar' 

W przeciwnym razie Groovy potraktuje to jako szablon i zawiedzie, gdy Nie znaleziono właściwość bar

Tak, dla przykładu:

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

Wielkie dzięki Tim, działa idealnie –

+0

W jaki sposób określasz plik, w którym chcesz zastąpić? –

0

W Gradle plików zastąpić apostrofów oraz podwójny ukośnik:

'\\$bar' 
Powiązane problemy