如何将String转换为GString并替换Groovy中的占位符?

时间:2016-05-22 20:04:10

标签: groovy

我想从数据库中读取一个String,并通过将其转换为GString来替换占位符。我可以用Eval做到这一点吗?还有其他想法吗?

String stringFromDatabase = 'Hello ${name}!'
String name = 'world'

assert 'Hello world!'== TODO

4 个答案:

答案 0 :(得分:14)

您可以在Groovy中使用Template框架,因此这样做可以解决您的问题:

String stringFromDatabase = 'Hello ${name}!'
String name = 'world'

def engine = new groovy.text.SimpleTemplateEngine()
assert 'Hello world!'== engine.createTemplate(stringFromDatabase).make([name:name]).toString()

您可以在此处找到文档:http://docs.groovy-lang.org/latest/html/documentation/template-engines.html#_introduction

GString类是抽象的,抽象类的GStringImpl实现在字符串数组上工作,它从解析阶段和值中获得。

答案 1 :(得分:1)

如果你想使用占位符,你应该使用双引号字符串文字。

以下内容应该有效:

String name = 'world'
String stringFromDatabase = "Hello ${name}!" //use double quotes

assert 'Hello world!' == stringFromDatabase

请参阅official Groovy documentation about Strings,了解其他可行的方法。

答案 2 :(得分:1)

我用Eval解决了这个问题:

String stringFromDatabase = 'Hello ${name}!'
String name = 'world'

assert 'Hello world!' == Eval.me('name', name, '"' + stringFromDatabase + '"')

答案 3 :(得分:0)

这也使用模板作为 Jacob 的答案,但尝试从当前变量解析绑定。如果您不知道要替换的值,则很有用:

String stringFromDatabase = 'Hello ${name}!'
// variables w/o type or def keyword end up in this.binding.variables
name = 'world'

def engine = new groovy.text.SimpleTemplateEngine()
assert 'Hello world!'== engine.createTemplate(stringFromDatabase).make(this.binding.variables).toString()

CAVEAT:可以替换的变量没有 type 或 def 关键字。