-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

10 / 05
Sat

Java の String クラスには replaceAll というメソッドがあって、 これが正規表現を使えるので便利なんです。 例えば、 こんな感じです (Scala で書いてあります)。

val string = "1234abc56de789fgh0"
val result = string.replaceAll("\\d+", "N")
println(result)

実行すると NabcNdeNfghN が表示されます。

さて、 なかなか便利なんですが、 1 つ欠点があります。 例えば、 正規表現にマッチした部分が 100 以上だったら M に置換し、 そうでなかったら N に置換したい場合はどうすれば良いでしょうか。 replaceAll メソッドは、 置換先は固定の文字列なので、 こういったことはできません。 そこで、 Scala の特長の 1 つである引数に関数をとれることを利用して、 replaceAll メソッドをオーバーロードしてみます。

def replaceAll(regex: String, replacer: String => String): String = {
  val matcher: Matcher = Pattern.compile(regex).matcher(string)
  val buffer: StringBuffer = new StringBuffer
  while (matcher.find) {
    matcher.appendReplacement(buffer, replacer(matcher.group))
  }
  matcher.appendTail(buffer)
  return buffer.toString
  }
}

このメソッドを使うと、 先に挙げた例も実現できます。

val string = "1234abc56de789fgh0"
val result = string.replaceAll("\\d+", (matched: String) => {
  if (matched.toInt >= 100) {
    "M"
  } else {
    "N"
  }
})
println(result)

実行すると MabcNdeMfghN が表示され、 正しく置換されていることが分かります。

かなり便利じゃないですか? しかも、 Ruby と同じように書けるところが好きです。 ちなみに、 Ruby で同じことをするとこんな感じになります。

string = "1234abc56de789fgh0"
result = string.gsub(/\d+/) do |matched|
  if (matched.to_i >= 100)
    "M"
  else
    "N"
  end
end
puts(result)
スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。