2012-05-25 17 views
6

Estoy usando replaceAll() en Groovy y quedar atrapado cuando la cadena de reemplazo contiene el símbolo $ (que se interpreta como una referencia del grupo regexp).Groovy replaceAll where replacement contains dollar symbol?

estoy encontrando que tengo que hacer un poco agraciado doble sustitución:

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

Dónde:

replacement = "$bar" 

Y resultado deseado es:

replaced = "$bar" 

¿Hay una mejor forma de realizar este reemplazo sin el paso intermedio?

+0

¿Cuál es su cadena de entrada, de salida y de lo ¿Esperas? –

+0

He aclarado la pregunta –

Respuesta

8

Como se dice en el docs for replaceAll, puede utilizar Matcher.quoteReplacement

def input = "You must pay %price%" 

def price = '$41.98' 

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

Tenga en cuenta también que en lugar de comillas dobles en:

replacement = "$bar" 

Usted desea utilizar comillas simples como:

replacement = '$bar' 

De lo contrario, Groovy lo tratará como una plantilla y fallará cuando ca No encuentra el inmueble bar

Así que, por su ejemplo:

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

Muchas gracias Tim, funciona perfectamente –

+0

¿Cómo se especifica el archivo para hacer este reemplazo? –

0

En Gradle archivos para reemplazar el uso de comillas simples y doble barra:

'\\$bar'