我想在配置文件中为某些变量创建“自定义”占位符。我以为我会使用这种语法${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
答案 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}}。正则表达式的使用避免了这一点,因为在正则表达式上没有进行变量替换。