groovy多行字符串中的条带缩进

groovy多行字符串中的条带缩进,groovy,Groovy,不幸的是,多行字符串上的stripIndent不起作用。 旁注:我的IDE代码样式首选项只允许空格缩进(制表符将替换为空格)。但我认为这应该没有关系 def s = """ This is multiline """ println s.stripIndent() 不打印 This is multiline 正如所料 输出带有缩进 This is multiline 这里出了什么

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

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

This
is
multiline
正如所料

输出带有缩进

This 
               is
               multiline
这里出了什么问题

我将Groovy2.0.7与EclipseIndigoSR2一起使用


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

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

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

def s = """ This 
            is
            multiline
"""
要解决此问题,可以转义多行字符串的第一行,如以下示例所示,以获得预期结果:

def s = """\
           This
           is
           multiline
"""
也可使用(如果可行)


对于其他任何有类似问题的人,stefanglase的解决方案都很好,但当在一个失败的断言中包含一个多行字符串时,在Spock测试中给了我一个MultipleComplationErrorSexException:

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()

现在,当断言失败时,您将看到通常的diff指示出错的地方,而不是编译异常。

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


此外,在执行单行操作时,不能使用
\
。如果我使用
''\This Is Multiline'',我可以复制您的确切问题。stripIndent()

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

String query = '''
    select ${CONTROL_ID} from ${TABLE_NAME} 
        where 
            location_id = ( 
                select id from location where code = ${locationCode} 
            )  
''';
在Groovy中看起来比使用
“…”+TABLE\u 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
)作为事实上的起始行或锚点。适用于混合制表符和空格

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

是从带边距的行中去掉前导空格

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

比如说,

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

println(s.stripMargin("*"))
println(s.stripMargin("*").trim())
将导致

This 
is
multiline
最好的做法是,我们在最后追加,以消除整个字符串的前导空格和尾随空格

比如说,

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

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

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


是的,你是对的,换行符仍然存在,但是缩进呢。还有压痕。这就是我的问题,因为你应该像我的例子中看到的那样,对多行字符串的第一行进行转义。否则,检测缩进可以得到正确的空白量来删除。好的,谢谢。我不知道缩进计算是基于第一行的。从groovydocs for stripIndent:
从字符串中的每一行中去掉前导空格。前导空格数最少的行决定要删除的行数。计算要删除的前导空格数时,将忽略仅包含空格的行。
。我想这解释得很清楚。也就是说,它不是基于第一行,而是基于前导空格数最少的行。将此作为对@josh feldman answer的评论。用户没有足够的声誉进行评论。根据@protocol-x answer和我自己的投票结果进行了否决testing@akostadinov嗨,亚历克斯:)对我有用<代码>结果:“这\n是\n多行\n”@OndraŽižka被否决,因为这不是对stefanglase答案的改进。只是乔希的一个错误。很高兴见到你!关于regex-s,我想为
groovyConsole
命令添加一个插件。节省不少时间。