Webエンジニア

【Kotlin】改行コードを含んだ文字列を trimIndent を使って一行で出力させる方法

バリデーションのテスト等で長い文字列を出力する必要に迫られるときがある。
何も考えずに書くと下記のようになるが、エディタの最大文字数を超えたりして可読性も落ちる。

val moge = "https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp"

println(moge)
スポンサーリンク

Kotlinのヒアドキュメントを使って改行させる

ヒアドキュメントを使って適当な所で改行を入れれば可読性は上がる。

val moge = """
    https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp
    """
    
println(moge)

が、出力結果は改行コードが入るし、インデントもそのまま残る。

分かりにくい Kotlin の trimIndent の挙動を確認してみる

trimIndent()を使ってインデントを消す。

val moge = """
        https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp
        """.trimIndent()

println(moge)

すべての行をチェックして最小のインデントの行に合わせてインデントを消す。

Detects a common minimal indent of all the input lines, removes it from every line and also removes the first and the last lines if they are blank (notice difference blank vs empty).

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/trim-indent.html

つまり、出力結果はこうなる。

最小の行に合わせてて左側が詰められる。

trimIndent お試し例1

trimIndent()がどう動くかをもう一度おさらい。

「1行目が半角スペース1つあけてa」と記述した。

これが最小のインデント行なのでこれを起点に左側のスペースを削除される。以下3行はそのままのインデントが保持される。

val moge = """ a
        https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp
        """.trimIndent()

println(moge)

出力結果

trimIndent お試し例2

これは3行目のbを起点に左側のインデントが削除される。

val moge = """              
         a
     b    
        https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp
        """.trimIndent()

println(moge)

つまり出力結果はこうなる。

replace()を使って文字列から改行コードを取り除く

trimIndent()でひとまずヒアドキュメントを使った際のインデントは取り除くことができた。
あとは隠れて潜む改行コードを取り除けば1行で出力される。

正規表現でマッチさせて空文字で置換

replace() の第一引数に正規表現で改行コードを渡す。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/replace.html

val moge = """
        https://exampleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp
        """.trimIndent().replace(Regex("""\r\n|\n|\r"""), "")

println(moge)
  • Regex("""\r\n|\n|\r""")

Windows環境の改行コード\r\n 、 Linux環境の改行コード\n、Mac環境の改行コード\r をパイプを使いORの条件にしている。

第二引数には””を与えて、マッチした改行コードを空で置換している。

出力結果

ちょっと画像は横に長くなって見づらいですが、無事に一行にまとめて出力することが出来た。

環境

Kotlin v1.5.21

参考

正規表現:改行コードの表現方法。置換による削除 / WWWクリエイターズ

Kotlin: trimIndent と trimMargin の違い / Qiita @KenjiOtsuka

コメント

タイトルとURLをコピーしました