groovy中的格式字符串

hkmswyz6  于 2022-11-01  发布在  其他
关注(0)|答案(5)|浏览(359)

我想用以下值替换%s

<server>
    <id>artifactory</id>
    <username>%s</username>
    <password>%s</password>
</server>

groovy中有没有myString.format("name", "pass")方法?

ni65a41a

ni65a41a1#

Groovy内置了对字符串插值的支持。您所需要的只是使用一个GString

def name = "name"
def pass = "pass"

String formatted = """
<server>
    <id>artifactory</id>
    <username>$name</username>
    <password>$pass</password>
</server>
"""

如果值是以数组或集合的形式出现的,甚至可以使用params[n]来代替命名变量($name),如下所示:

def params = ['name', 'pass']

String formatted = """
<server>
    <id>artifactory</id>
    <username>${params[0]}</username>
    <password>${params[1]}</password>
</server>
"""

如果您的字符串需要外部化,可以使用template engines
除此之外,您还可以使用普通的Java String.format

def formatted = String.format(myString, "name", "pass")
rta7y2nd

rta7y2nd2#

基于java的groovy,在java中,String类中有format方法
您必须先建立一个对象,然后才能使用它。
所以这个应该能用

def s='''<server>
    <id>artifactory</id>
    <username>%s</username>
    <password>%s</password>
</server>'''
println String.format(s, "name", "pass")
pgvzfuti

pgvzfuti3#

您可以使用DefaultGroovyMethods中的sprintf

def name = "name"
def pass = "pass"

String formatted = """
<server>
    <id>artifactory</id>
    <username>$name</username>
    <password>$pass</password>
</server>
"""
def f = sprintf( formatted, name, pass )
rm5edbpk

rm5edbpk4#

在单个位置收集上述答案和评论,有两种方法:
1.基于Java String.format函数see above,它在groovy中被 Package 到方便函数sprintf中,参见例如herehere
1.基于字符串插值,更具体地说,这种情况。
1.[编辑]正如ernest_k在评论中所建议的,模板化的更好的解决方案是模板引擎。它比单纯的String.format强大得多,但当然,需要一些学习。
在我个人看来,第一个选项更适合最初提出的问题,因为它允许创建“模板”字符串,然后可以在代码中的任意位置使用任意参数任意次数。这似乎是最初问题中的用例。
通常,字符串插值和sprintf之间有两个主要区别:
1.字符串插值不允许格式化值。
1.字符串插值是在定义它的地方进行求值的(以它的标准形式),所以它不允许模板化。即使以它的“特殊”形式({-> expr})使用,它仍然没有模板应用的显式行为,而是依赖于具有特定名称的外部定义的变量,在我看来这是不太可靠的。
作为模板化用例的示例,请考虑:

// can be defined in the same function, or as static variable in the class or even
// in other class
final String URL_TEMPLATE = 'http://fake.weather.com/rest/%s' // arg - country abbreviation

// ...

// Here we want to get weather for different countries.
def countries = ['US', 'DE', 'GB']
for (country in countries) {
    def url = URL_TEMPLATE.format(country)
    // send the request, accumulate the results
}

这个解决方案不容易使用字符串插值。当然,我承认,它仍然有可能建立解决方案也基于字符串插值,但它会看起来很不一样。

wixjitnu

wixjitnu5#

Groovy有一个SimpleTemplateEngine可以使用。对于简单的情况来说,这可能有点过头了,但是举个例子,假设你想从一个文件中读取一个模板,并在那里注入变量。使用%s将是一场噩梦。SimpleTemplateEngine是一种方法:

import groovy.text.SimpleTemplateEngine

def engine = new SimpleTemplateEngine()
def template = 'User: ${user}\nPassword: ${password}'

def binding = [
  "user": "root",
  "password": "toor"
]

def result = engine.createTemplate(template).make(binding).toString()

assert result == "User: root\nPassword: toor"

所以总结一下:

*Groovy字符串插值

def user = "root"
def password = "toor"
// Note: Remember to use single quotes!
def result = "User: ${user}\nPassword: ${password}"

assert result == "User: root\nPassword: toor"

优点:

  • 快速
  • 简单型
  • 可读性一般较好
  • 你可以在胡子上做几乎所有的事情

缺点:

  • 变量必须在插值时可访问
  • 可读性可能会急剧下降,开发人员会屈服于在胡须之间放置太多内容的诱惑,例如"Hello ${someRandomFunction('Arnold', anotherFunction(arr[1]))}"
    *Java字符串格式
// Now template can be defined before variables
def template = "User: %s\nPassword: %s"
def user = "root"
def password = "toor"
def result = String.format(template, user, password)

assert result == "User: root\nPassword: toor"

优点:

  • 快速
  • 简单型
  • 标准的Java库,因此Java开发人员将熟悉它
  • 少量变量的良好可读性
  • 内置数字格式化程序(如添加前导零、尾随零等)
  • 可以在定义变量之前定义模板

缺点:

  • 对于大量的变量,可读性会急剧下降,因为您以Hello %s, I'm %s and I'm %d old. I live in %s, %s. My %s is %s.这样的模板结束
  • 变量必须作为单独的参数传递
    *精彩冲刺
def template = "User: %s\nPassword: %s"
def result = sprintf(template, ["root", "toor"])

assert result == "User: root\nPassword: toor"

优点:

  • Java String.format相同
  • 可以将变量作为单个数组传递

缺点:

  • Java String.format相同,但传递变量的cons除外
    *Groovy简单模板引擎
import groovy.text.SimpleTemplateEngine

def engine = new SimpleTemplateEngine()
def template = 'User: ${user}\nPassword: ${password}'

def binding = [
  "user": "root",
  "password": "toor"
]

def result = engine.createTemplate(template).make(binding).toString()

assert result == "User: root\nPassword: toor"

优点:

  • 可读性一般较好
  • 你可以在胡子上做几乎所有的事情
  • 你可以在变量之前定义/读取模板,这对于保存在文本文件中的较大模板来说是完美的

缺点:

  • 您需要进行导入并创建一个示例,因此它肯定不是像上面那样快速简单的解决方案
  • 可读性可能会急剧下降,开发人员会屈服于在胡须之间放置太多内容的诱惑,例如"Hello ${someRandomFunction('Arnold', anotherFunction(arr[1]))}"

一般来说,我最喜欢的是Groovy的String插值和SimpleTemplateEngine,因为我不介意多导入一个类。但选择权在你:)

相关问题