52

残念ながらstripIndent、複数行の文字列では機能しません。補足: 私の IDE コード スタイル設定では、スペース インデントのみが許可されています (タブはスペースに置き換えられます)。しかし、これは問題ではないと思います。

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

印刷しない

This
is
multiline

予想通り。

出力はインデント付きです。

This 
               is
               multiline

ここで何がうまくいかないのですか?

Eclipse Indigo SR2 で Groovy 2.0.7 を使用しています。

最初の行でバックスラッシュ \(文字列継続文字) を使用すると、問題が解消されるようです。しかし、なぜこれが必須なのか理解できません。

4

7 に答える 7

65

.stripIndent()複数行の文字列のインデントを削除するために使用できます。ただし、インデントの量が指定されていない場合は、先頭のスペースが最も少ない行から自動的に決定されることに注意してください。

This文字列を考えると、これは複数行の文字列のすべての行から削除される前の空白が 1 つだけになります。

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

この問題を回避するには、次の例に示すように、複数行の文字列の最初の行をエスケープして、期待どおりの結果を得ることができます。

def s = """\
           This
           is
           multiline
"""
于 2013-11-09T20:49:39.483 に答える
27

.stripMargin()も使用します (可能な場合)。

def s = """ This 
            | is
            | multiline
        """
println s.stripMargin().stripIndent()
于 2013-11-09T20:58:27.820 に答える
5

同様の問題を抱えている他の人にとって、ステファングラスの解決策は素晴らしいですが、失敗したアサーションに複数行の文字列を含めると、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()

これで、アサーションが失敗すると、コンパイル例外ではなく、何が問題だったかを示す通常の diff が表示されます。

于 2014-11-04T22:06:58.750 に答える
2

==の代わりに使用するつもりでした=か? 私が得るエラーは、あなたの例を使用したときです。に戻して=例を使用するreplaceFirst()と、エラーなしで正常に動作します。

\また、単線の場合は a を使用できません。使用すると、正確な問題を再現できます'''\ This Is Multiline '''.stripIndent()

于 2017-01-05T13:38:29.033 に答える