如何在Groovy中将字符串转换为GString并替换占位符?

22

我想从数据库中读取一个字符串并使用GString将其占位符替换。我可以用Eval实现吗?还有其他的想法吗?

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

assert 'Hello world!'== TODO

http://stackoverflow.com/questions/36805214/evaluating-value-of-an-expression-as-expression-in-groovy/36806883#36806883 - Emmanuel Rosa
4个回答

18

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

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实现作用于字符串数组,这些数组与值一起从解析阶段获取。


这太棒了 https://groovyconsole.appspot.com/script/5174410931601408 - Marcello DeSales

2
我使用Eval解决了这个问题:
String stringFromDatabase = 'Hello ${name}!'
String name = 'world'

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

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

注意:可以替换的变量没有类型或def关键字。


结果发现这有点破坏了一切。https://stackoverflow.com/q/67273565/1015495 - Mike G

-2

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

以下代码应该可以正常工作:

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

assert 'Hello world!' == stringFromDatabase

请查看Groovy官方文档关于字符串,以了解其他使其工作的方法。


3
它正在运作。但是我的stringFromDatabase是通过从数据库中读取一个对象创建的,这将导致生成一个字符串: - J.T.
伪代码: def templateFromDatabase = Template.get(123); def stringFromDatabase = templateFromDatabase.source; assert stringFromDatabase instanceof String; // true ... TODO - J.T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接