不幸的是,stripIndent
在多行字符串上不起作用。我的IDE代码风格首选项只允许空格缩进(制表符将被空格替换)。但我认为这应该没有关系。
def s = """ This
is
multiline
"""
println s.stripIndent()
不打印
This
is
multiline
如预期的那样。
输出带有缩进。
This
is
multiline
这是怎么回事?
我使用Groovy 2.0.7和Eclipse靛蓝SR2。
在第一行使用 * 反斜杠 * \
(字符串连续字符)后,问题似乎消失了。但我不明白为什么必须这样做。
7条答案
按热度按时间bxfogqkk1#
你可以使用
.stripIndent()
来删除多行字符串的缩进。但是你必须记住,如果没有给出缩进量,它将自动从包含 * 最少 * 个前导空格的行中确定。给定字符串,这将是
This
前面的一个白色,它将从多行字符串的每一行中删除。要解决此问题,您可以转义多行字符串的第一行,如以下示例所示,以获得预期的结果:
pb3skfrl2#
也可以使用.stripMargin()(如果可行)。
dvtswwa33#
对于其他有类似问题的人来说,stefanglase的解决方案很棒,但在Spock测试中,当在Assert中包含多行String时,会给我一个MultipleCompilationErrorsException:
我的解决方案是:
现在,当Assert失败时,您将看到通常的diff,指示出错的地方,而不是编译异常。
r6vfmomb4#
stripMargin()
是从有边距的行中去掉前导空格。默认边距为
|
。我们也可以指定自定义边距。例如,
将导致
最好的做法是在末尾追加
.trim()
,以消除整个字符串的前导和尾随空格。例如,
xuo3flqw5#
我有一个类似的用例,因为我想将我的SQL查询格式化为行。例如嵌套查询:
在Groovy中看起来比使用
"..."+ TABLE_NAME +"..."
的Java版本要好得多,我相信您也会同意这一点。这类字符串不适用于
.stripIndent()
方法,而是保留了query
(上面)中的新行,目的是--注意行尾没有“\”。因此
给予一个格式整齐的单行SQL查询结果:
我发现这很有帮助,也更容易阅读。我用一个空格来替换,以确保SQL保持离散。重要的是使用换行符(
\n
)作为 * 事实上 * 的起始行或锚。对于混合的TAB-s和SPACE-s来说很好。当然,它也适用于原始问题。
ffvjumwh6#
正如@stefanglase提到的,我使用
.stripIndent()
和.trim()
组合:dhxwm5r47#
你打算使用
==
而不是=
吗?我得到的错误是在使用你的例子时。如果我把它改回=
并使用你的例子而不使用replaceFirst()
,它可以正常工作,没有错误。你也不能使用一个
\
当做一个单行。我可以复制你的确切问题,如果我使用'''\ This Is Multiline '''.stripIndent()