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' ) )