Groovy replaceAll где замена содержит символ доллара?

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

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

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

где:

replacement = "$bar"

и желаемый результат:

replaced = "$bar"

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

2 ответов


как говорится в документы для replaceAll, вы можете использовать Matcher.quoteReplacement

def input = "You must pay %price%"

def price = '.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' ) )

в файлах gradle для замены используйте одинарные кавычки и двойную косую черту:

'\$bar'