不幸的是,多行字符串上的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)
dma*_*tro 19
也可以使用.stripMargin()(如果可行的话).
def s = """ This
| is
| multiline
"""
println s.stripMargin().stripIndent()
Run Code Online (Sandbox Code Playgroud)
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)
对于其他有类似问题的人,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 指示出了什么问题,而不是编译异常。
| 归档时间: |
|
| 查看次数: |
18480 次 |
| 最近记录: |