不幸的是,多行字符串上的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)似乎消失了。但我不明白为什么这是必须的。
答案 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*