在groovy多行字符串中删除缩进

Cen*_*giz 37 groovy

不幸的是,多行字符串上的stripIndent不起作用.附注:我的IDE代码样式首选项仅允许空格缩进(选项卡将替换为空格).但我认为这应该没有问题.

def s = """ This 
            is
            multiline
"""
println s.stripIndent()
Run Code Online (Sandbox Code Playgroud)

不打印

This
is
multiline
Run Code Online (Sandbox Code Playgroud)

正如所料.

输出是缩进.

This 
               is
               multiline
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

我在Eclipse Indigo SR2中使用Groovy 2.0.7.

在第一行中使用反斜杠(String continuation character)似乎消失了这个问题.但我不明白为什么这是必须的.

ste*_*ase 45

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

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

def s = """ This 
            is
            multiline
"""
Run Code Online (Sandbox Code Playgroud)

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

def s = """\
           This
           is
           multiline
"""
Run Code Online (Sandbox Code Playgroud)

  • 从stripIndent的groovydocs:`删除String中每一行的前导空格。前导空格最少的行确定要删除的号码。计算要剥离的前导空格数时,仅包含空格的行将被忽略。我认为这很清楚地解释了它。也就是说,它不是基于第一行,而是基于前导空格最少的行。 (2认同)

dma*_*tro 19

也可以使用.stripMargin()(如果可行的话).

def s = """ This 
            | is
            | multiline
        """
println s.stripMargin().stripIndent()
Run Code Online (Sandbox Code Playgroud)


Gra*_*eng 7

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

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

例如,

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

println(s.stripMargin("*"))
Run Code Online (Sandbox Code Playgroud)

将导致

This 
is
multiline
Run Code Online (Sandbox Code Playgroud)

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

例如,

println(s.stripMargin("*").trim())
Run Code Online (Sandbox Code Playgroud)


Jos*_*man 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()
Run Code Online (Sandbox Code Playgroud)

我对此的解决方案是:

def myString = '''
  This
  Is
  Multiline
  '''.replaceFirst("\n","").stripIndent()
Run Code Online (Sandbox Code Playgroud)

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