String groovy中的字符串格式

String groovy中的字符串格式,string,groovy,string-formatting,String,Groovy,String Formatting,我想用值替换%s <server> <id>artifactory</id> <username>%s</username> <password>%s</password> </server> 人工制品 % % groovy中是否有myString.format(“name”、“pass”)方法?groovy基于java,java中String类中有format方法 所

我想用值替换
%s

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

人工制品
%
%

groovy中是否有
myString.format(“name”、“pass”)
方法?

groovy基于java,java中
String
类中有
format
方法

所以这应该行得通

def s='''<server>
    <id>artifactory</id>
    <username>%s</username>
    <password>%s</password>
</server>'''
println String.format(s, "name", "pass")
def s=''
人工制品
%
%
'''
println String.format(s,“name”,“pass”)

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

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

String formatted = """
<server>
    <id>artifactory</id>
    <username>$name</username>
    <password>$pass</password>
</server>
"""
如果字符串需要外部化,可以使用

除此之外,您还可以使用普通的Java
String.format

def formatted = String.format(myString, "name", "pass")
您可以使用fromDefaultGroovyMethods

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 )
def name=“name”
def pass=“pass”
字符串格式为“”
人工制品
$name
$pass
"""
def f=sprintf(格式化、名称、过程)

在一个地方收集上述答案和评论,有两种方法:

  • 基于Java
    String.format
    功能,该功能在groovy中封装为便利函数
    sprintf
    请参见例如或
  • 基于和更具体地说
  • [编辑]正如ernest_k在评论中所建议的,模板化的更好解决方案是。它比裸String.format更强大,但当然,需要一些学习
  • 在我个人看来,第一个选项更适合最初提出的问题,因为它允许创建“模板”字符串,然后可以在代码的任意位置与任意参数一起使用任意次数。这似乎是原始问题中的用例

    通常,字符串插值和sprintf之间有两个主要区别:

  • 字符串插值不允许格式化值
  • 字符串插值是在定义的地方(以其正常形式)进行计算的,因此它不允许模板化。即使以其“特殊”形式(
    {->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
    }
    
    

    这个解决方案不容易使用字符串插值。当然,我承认,也可以基于字符串插值构建解决方案,但看起来会有很大不同。

    作为另一种变体,可以将字符串类用作一个类别:
    use(string){println s.format(“name”,“pass”)}
    将这样的方法添加到
    StringGroovyMethods
    中可能会很好。这应该是公认的答案。不是因为另一个不工作,而是groovy不是java,如果您要在groovy中键入java。。。那么groovy的用途是什么?(间接费用?)国际海事组织,这不应被接受。尽管字符串插值在大多数情况下都可以完成这项工作,其中字符串格式化已经完成,但它并不是100%替换(特别是这里解释的方法)。不同之处在于,当使用“格式”时,就有一个模板,可以使用不同的参数多次格式化,并且可能发生在完全不同的地方。相反,字符串插值是立即计算的(除非使用
    ${->expr}
    来启用延迟计算),但即使在这种情况下,它的使用方式也略有不同。关于字符串插值的另一点是(据我所知),它不支持精确的格式设置(即指定值的格式)。对于当前的问题来说,这并不重要,但如果要插入的值是双精度值,那么它可能更相关。@DmitriiSemikin我认为您的评论是关于一个没有被问到的问题。如果问题是关于模板的,那么我会建议,但仍然不是
    String.format()
    。一个被接受的答案总是OP的选择,这就是为什么在许多好答案中有一个(或没有)被接受的答案是相当普遍的。这从来都不是问题。@ernest_k同意你的观点。我不知道“模板引擎”。从您的链接中,我无法理解它是否已经是Groovy的一部分,或者它是否只是计划包含在Groovy中(或者它是外部库?)。此外,对于简单的使用(如编写快速和肮脏的脚本),如果您不知道模板引擎是如何工作的,那么使用printf仍然更容易:)这里的工作是插值,而不是sprintf
    def=formatted
    将提供完全相同的结果。实际上,如果你使用
    def=sprintf(格式化为“hello”,“dude”)
    你不会有任何不同的结果这里提到的
    snprintf
    是完全有效的,但是正如@saamorim所提到的,这个例子是错误的:它使用字符串插值,这并不能完全回答这个问题。此外,提供的链接形式上是有效的,并不能真正提供有用的信息。类似这样的东西(谷歌的第一个结果)更相关:[或[。重要的细节是,使用标准Java格式化程序[
    // 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
    }