6

私はreplaceAll()Groovyで使用していますが、置換文字列に$シンボル(正規表現グループ参照として解釈されます)が含まれていると、問題が発生します。

私はかなり醜い二重交換をしなければならないことに気づいています:

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

どこ:

replacement = "$bar"

そして望ましい結果は次のとおりです。

replaced = "$bar"

中間ステップなしでこの置換を実行するより良い方法はありますか?

4

2 に答える 2

8

replaceAllのドキュメントに記載されているように、次を使用できますMatcher.quoteReplacement

def input = "You must pay %price%"

def price = '$41.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' ) )
于 2012-05-25T14:29:11.650 に答える
1

置き換えるgradleファイルでは、一重引用符と二重スラッシュを使用します。

'\\$bar'
于 2017-05-05T10:21:30.983 に答える