Groovy多行字符串中的条形缩进

acruukt9  于 2023-03-22  发布在  其他
关注(0)|答案(7)|浏览(244)

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

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

不打印

This
is
multiline

如预期的那样。
输出带有缩进。

This 
               is
               multiline

这是怎么回事?
我使用Groovy 2.0.7和Eclipse靛蓝SR2。
在第一行使用 * 反斜杠 * \(字符串连续字符)后,问题似乎消失了。但我不明白为什么必须这样做。

bxfogqkk

bxfogqkk1#

你可以使用.stripIndent()来删除多行字符串的缩进。但是你必须记住,如果没有给出缩进量,它将自动从包含 * 最少 * 个前导空格的行中确定。
给定字符串,这将是This前面的一个白色,它将从多行字符串的每一行中删除。

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

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

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

pb3skfrl2#

也可以使用.stripMargin()(如果可行)。

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

dvtswwa33#

对于其他有类似问题的人来说,stefanglase的解决方案很棒,但在Spock测试中,当在Assert中包含多行String时,会给我一个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()

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

r6vfmomb

r6vfmomb4#

stripMargin()是从有边距的行中去掉前导空格。
默认边距为|。我们也可以指定自定义边距。
例如,

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

println(s.stripMargin("*"))

将导致

This 
is
multiline

最好的做法是在末尾追加.trim(),以消除整个字符串的前导和尾随空格。
例如,

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

xuo3flqw5#

我有一个类似的用例,因为我想将我的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来说很好。
当然,它也适用于原始问题。

ffvjumwh

ffvjumwh6#

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

dhxwm5r47#

你打算使用==而不是=吗?我得到的错误是在使用你的例子时。如果我把它改回=并使用你的例子而不使用replaceFirst(),它可以正常工作,没有错误。
你也不能使用一个\当做一个单行。我可以复制你的确切问题,如果我使用'''\ This Is Multiline '''.stripIndent()

相关问题