52

不幸的是stripIndent,多行字符串不起作用。旁注:我的 IDE 代码样式首选项只允许空格缩进(制表符将被空格替换)。但我认为这应该没有关系。

def s = """ This 
            is
            multiline
"""
println s.stripIndent()

不打印

This
is
multiline

正如预期的那样。

输出带有缩进。

This 
               is
               multiline

这里出了什么问题?

我将 Groovy 2.0.7 与 Eclipse Indigo SR2 一起使用。

在第一行使用反斜杠 \(字符串连续字符)后,问题似乎消失了。但我不明白为什么这是必须的。

4

7 回答 7

65

您可以使用.stripIndent()删除多行字符串上的缩进。但是你必须记住,如果没有给出缩进量,它将自动从包含最少前导空格的行中确定。

给定您的字符串,这将是前面的一个空格,This将从您的多行字符串的每一行中删除。

def s = """ This 
            is
            multiline
"""

要解决此问题,您可以转义多行字符串的第一行,如以下示例所示,以获得预期结果:

def s = """\
           This
           is
           multiline
"""
于 2013-11-09T20:49:39.483 回答
27

也使用.stripMargin()(如果可行)。

def s = """ This 
            | is
            | multiline
        """
println s.stripMargin().stripIndent()
于 2013-11-09T20:58:27.820 回答
5

对于遇到类似问题的其他人,stefanglase 的解决方案很棒,但是当在失败的断言中包含多行字符串时,在 Spock 测试中给了我一个 MultipleCompilationErrorsException:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Spec expression: 1: unexpected char: '\' @ line 1, column 16.
   myString == '''\ This Is Multiline '''.stripIndent()

我对此的解决方案是:

def myString = '''
  This
  Is
  Multiline
  '''.replaceFirst("\n","").stripIndent()

现在,当断言失败时,您将看到通常的差异指示出了什么问题,而不是编译异常。

于 2014-11-04T22:06:58.750 回答
5

stripMargin()是从有边距的行中去除前导空格。

默认边距为|. 我们还可以指定自定义边距。

例如,

def s = """*This 
        *is
            *multiline
"""

println(s.stripMargin("*"))

将导致

This 
is
multiline

最佳实践是我们.trim()在末尾追加以消除整个字符串的前导和尾随空格。

例如,

println(s.stripMargin("*").trim())
于 2019-05-08T20:43:26.600 回答
3

我有一个类似的用例,因为我想格式化我的 SQL 查询。例如嵌套查询:

String query = '''
    select ${CONTROL_ID} from ${TABLE_NAME} 
        where 
            location_id = ( 
                select id from location where code = ${locationCode} 
            )  
''';

Groovy 看起来比 Java 版本好很多,"..."+ TABLE_NAME +"..."我相信您会同意。

这种字符串不适用于该.stripIndent()方法。相反,我保留(上)中的新行是query出于某种目的——注意行尾没有“\”。

因此

String query = """
    select ${CONTROL_ID} from ${TABLE_NAME} 
        where 
            location_id = ( 
                select id from location where code = '${locationCode}' 
            )  
""".replaceAll( /\n\s*/, " " );

println  "  Query= ${query};"; 

给出一个格式整齐的单行 SQL 查询结果:

  Query = select id from controls where  location_id = (  select id from location where code = '003');

我觉得这很有帮助,也更容易阅读。我用一个空格替换以确保 SQL 保持离散。重要的部分是使用 newline( \n) 作为事实上的开始行或锚点。适合混合 TAB-s 和 SPACE-s。

当然,它也适用于原始问题。

于 2017-08-25T01:35:09.437 回答
2

您是否打算使用==而不是=?我得到的错误是在使用您的示例时。如果我将其改回=并使用您的示例而不使用它,则replaceFirst()它可以正常工作且没有错误。

\做单行时也不能使用 a 。如果我使用,我可以复制您的确切问题'''\ This Is Multiline '''.stripIndent()

于 2017-01-05T13:38:29.033 回答
1

正如@stefanglase 提到的,我.stripIndent()结合使用.trim()

String mystring = """
     My multiline
          string
     contains blank lines
           at the beginning and the end
"""
print "*${mystring.stripIndent()}*"
print "*${mystring.stripIndent().trim()}*"


>*
>My multiline
>     string
>contains blank lines
>      at the beginning and the end
>*
>*My multiline
>     string
>contains blank lines
>      at the beginning and the end*
于 2019-05-17T14:15:50.770 回答