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

时间:2013-11-09 20:42:59

标签: groovy

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

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

无法打印

This
is
multiline

正如所料。

输出是缩进。

This 
               is
               multiline

这里出了什么问题?

我在Eclipse Indigo SR2中使用Groovy 2.0.7。

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

7 个答案:

答案 0 :(得分:38)

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

鉴于你的字符串,这将只是This前面的一个空格,它将从你的多行字符串的每一行中删除。

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

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

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

答案 1 :(得分:15)

同样使用.stripMargin()(如果可行)。

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

答案 2 :(得分:3)

对于其他有类似问题的人来说,stefanglase的解决方案很棒,但在断言中包含多行String时,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()

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

答案 3 :(得分:2)

您打算使用==而不是=?我得到的唯一错误是使用你的例子。如果我将其更改回=并使用没有replaceFirst()的示例,它可以正常工作而没有错误。

另外,在执行单行时也不能使用\。如果我使用'''\ This Is Multiline'''.stripIndent()

,我可以复制您的确切问题

答案 4 :(得分:2)

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

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

在Groovy中看起来比使用"..."+ TABLE_NAME +"..."的Java版本好多了,因为我相信你们可以同意。

这种字符串不适用于.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保持离散。重要的是使用换行符(\n)作为事实上的起始行或锚点。适用于混合TAB-s和SPACE-s。

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

答案 5 :(得分:2)

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

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

例如,

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

println(s.stripMargin("*"))

将导致

This 
is
multiline

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

例如,

println(s.stripMargin("*").trim())

答案 6 :(得分:0)

正如@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*