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のものがそのまま使用できます。記述方法に関しては以下をご覧ください。
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つ目は正規表現とラムダ式を渡す方法です。
![](https://pouhon.net/wp-content/uploads/2020/05/kotlin08.png)
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
メソッドを活用できる場面はグッと広がるはずです。