如何将$ {Month}替换为字符串?

时间:2014-10-24 00:21:10

标签: groovy str-replace placeholder

我想在配置文件中为某些变量创建“自定义”占位符。我以为我会使用这种语法${Variable_name}。但是当我想用值替换占位符时,我无法使其工作。我不需要打印最终值,但将其传递给另一个变量。我只使用println进行调试。字符串变量tmp包含从xml配置文件中读取的字符串。所以我需要tmp2才能找到占位符被替换的正确字符串。

String Month = "October"
String tmp = 'This is ${Month} - a month of Love'
String tmp2 = tmp

println tmp2

//println tmp.replaceAll(~/${Month}/,Month)
println tmp.replaceAll("${Month}",Month)   //prints This is ${Month} of Love
println tmp.replaceAll('${Month}',Month)   // throws an error "WARNING: Sanitizing stacktrace:java.util.regex.PatternSyntaxException: Illegal repetition near index 0" 
// desired result to be printed is "This is October

有人可以帮助我让它工作或理解吗?我想我可以用其他一些字符来标记变量。配置文件保存为XML。

更新

我希望这段代码能更好地解释我想要实现的目标

String Month = "October"


// content of the file (c:/tmp/conf.txt) is --> This is ${Month} - a month of Love
// I want f2 to contain "This is October - a month of Love"
// println is not a choice as I don't use println in my code
// I need a variable to contain the final string

def f2 = new File('c:/tmp/conf.txt') //use same path
println f2.text

3 个答案:

答案 0 :(得分:8)

您可以使用Java String format方法:

String month = 'October'
String tmp = 'This is %s - a month of Love'
String tmp2 = String.format(tmp, month)

或者,为了保留${Month}的使用,您可以使用:

import groovy.text.SimpleTemplateEngine
String month = 'October'
String tmp = 'This is ${Month} - a month of Love'
String tmp2 = new SimpleTemplateEngine().createTemplate(tmp).make(Month:month)

答案 1 :(得分:5)

如果您真的想要对文件内容使用Groovy的GString语法(类似shell "${var}"变量替换),那么您需要的是GStringTemplateEngine。话虽如此,与常规编译时GString工具不同,引擎本身对您的本地变量环境一无所知,因此在执行引擎时必须传入替换值的映射({{ 1}}方法)。这是它的样子:

make()

鉴于文件内容:

import groovy.text.GStringTemplateEngine

def replacements = [Month:'October']
def file = new File('template.txt')
def engine = new GStringTemplateEngine()
def template = engine.createTemplate(file).make(replacements)
println template

打印以下结果:

This is ${Month} - a month of Love

答案 2 :(得分:1)

最简单的方法可能就是:

String Month = 'October'
String tmp = 'This is ${Month} - a month of Love'
String tmp2 = tmp.replaceAll(/\$\{Month\}/, Month)

assert tmp2 == 'This is October - a month of Love'

//alternate test
def f2 = new File('~/dump.txt') //use same path
String tmp3 = f2.text.replaceAll(/\$\{Month\}/, Month)
println tmp3 //prints This is October - a month of Love

您提供的第一个示例中的代码中的问题是Groovy正在使用

println tmp.replaceAll("${Month}",Month)

并将其内部转换为

println tmp.replaceAll("October",Month)

。当Groovy捕获带有${}的双引文字时(我说一个字符串,但它实际上是一个GString),它会替换{{{{{{{{ 1}}。正则表达式的使用避免了这一点,因为在正则表达式上没有进行变量替换。