[Kotlin]replaceメソッドを使った様々な置き換え方法

Kotlinのreplaceメソッドがただ単に「aをbに置き換えるだけ」のメソッドであると思っているなら、もしかするとあなたは損しているかもしれません。

今回は実は奥が深いreplaceメソッドの使い方3種類をご紹介していきたいと思います。

replaceメソッド

fun String.replace(
    oldValue: String,   //Char型も可
    newValue: String,   //Char型も可
    ignoreCase: Boolean = false     //大文字小文字を区別するか
): String

まずは基本的な使い方です。replaceメソッドの第一引数に「置き換えられる文字列」、第二引数に「置き換え先の文字列」を渡しましょう。

val str = "JavaとAndroid"
val r = str.replace("Java","Kotlin")
//KotlinとAndroid

変数strの“Java”は“Kotlin”に置き換えられ、新たな文字列が生成されます。

正規表現を使ったreplaceメソッド

fun CharSequence.replace(
    regex: Regex,
    replacement: String
): String

ここからは正規表現を使ったreplaceです。正規表現を使うことでより柔軟な置き換えを実現できます。まずはRegexオブジェクトを取得しましょう。文字列のtoRegexメソッドを使うか、Regexコンストラクタを使うか、どちらかを選びます。

なお正規表現はJavaのものがそのまま使用できます。記述方法に関しては以下をご覧ください。

Pattern (Java Platform SE 8)
val re = ".a.\\w".toRegex()     //toRegexメソッドで文字列を変換
val re = Regex(".a.\\w")     //Regexコンストラクタ

ここではヒアドキュメント(生文字列)を使用すると、エスケープ文字としてのバックスラッシュ\を記載する必要が無くなり、見た目もスッキリするのでオススメ。

val re = """.a.\w""".toRegex()     //バックスラッシュ1つでOK

このRegexオブジェクトをreplaceの第一引数として渡します。

str.replace(re,"Kotlin")
//KotlinとAndroid

正規表現にマッチした文字列はreplaceの第二引数の文字列に置き換えられました。

ラムダ式を使ったreplaceメソッド

inline fun CharSequence.replace(
    regex: Regex,     //正規表現を渡すのは上と同じ
    noinline transform: (MatchResult) -> CharSequence    //ラムダ式が入る
): String

replaceの使用方法3つ目は正規表現とラムダ式を渡す方法です。

[Kotlin]インライン関数 - inlineの一言で何が変わるのか
inline修飾子が付いた関数はインライン関数として動きます。インライン関数は主...
val str = "JavaとAndroid"
val re = """.a.\w""".toRegex()     //ここまでは上と同じ

val r = str.replace(re, {it.value.toUpperCase()})
val r = str.replace(re) {it.value.toUpperCase()}   //この書き方でもOK
//JAVAとAndroid

ラムダ式の中では正規表現オブジェクトにマッチしたMatchResultオブジェクトが「it」として参照されます。

MatchResultオブジェクトはそのままでは文字列としては扱えません。ここではvalueプロパティでオブジェクトの文字列表現を取得した後、toUpperCaseで大文字に変換しています。

「インプットを強化する」正規表現と「アウトプットを強化する」ラムダ式をうまく使えば、replaceメソッドを活用できる場面はグッと広がるはずです。

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