2012-05-25 1 views
6

Sto usando replaceAll() in Groovy e mi viene fuori quando la stringa di sostituzione contiene il simbolo $ (che viene interpretato come riferimento al gruppo di espressioni regolari).Groovy replaceAll dove la sostituzione contiene il simbolo del dollaro?

Sto scoprendo che devo fare un piuttosto brutto doppia sostituzione:

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

Dove:

replacement = "$bar" 

E risultato desiderato è:

replaced = "$bar" 

c'è un meglio modo di eseguire questa sostituzione senza il passaggio intermedio?

+0

Qual è la tua stringa di input, e ciò che in uscita ti aspetti? –

+0

Ho chiarito la domanda –

risposta

8

Come si dice nel docs for replaceAll, è possibile utilizzare Matcher.quoteReplacement

def input = "You must pay %price%" 

def price = '$41.98' 

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

Si noti inoltre che al posto delle virgolette doppie in:

replacement = "$bar" 

Si desidera utilizzare le virgolette singole come:

replacement = '$bar' 

Altrimenti Groovy lo tratterà come un modello e fallirà quando si ca Non trovare la proprietà bar

Quindi, per il tuo esempio:

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

Grazie mille Tim, funziona perfettamente –

+0

Come si specifica il file in cui effettuare la sostituzione? –

0

Nei file Gradle per sostituire le virgolette singole uso e doppia barra:

'\\$bar'