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