Skip to content

Instantly share code, notes, and snippets.

@erukiti
Last active January 13, 2017 05:25
Show Gist options
  • Save erukiti/6418667 to your computer and use it in GitHub Desktop.
Save erukiti/6418667 to your computer and use it in GitHub Desktop.
【Scala学習帳】正規表現で文字列を抜き出したい

例えば /([^:]+):[\s]+(.+)/ の正規表現の () の中の文字列二つを引っ張ってきて何かする場合、Ruby なら

if /([^:]+):[\s]+(.+)/ =~ line
  puts $1
  puts $2
end

みたいな書き方をするというか、LLなスクリプト言語だとこういう手軽な書き方がある。Scala ではどういう風に書けばいいのか

まず、文字列に .r メソッドを適用するとRegex型が得られる。

val pattern = "([^:]+):[\s]+(.+)".r

パターンマッチと組み合わせる

line match {
  case pattern(k, v) => {
    println(k)
    println(v)
  case _ => ()
}

注意点

この時のパターンは全文一致なので、部分一致を想定しているとマッチしない。

Regex型のapplyを使って抜き出す

val pattern(k, v) = line
println(k)
println(v)

というやり方だとマッチしない場合、Exception が飛ぶ。 必ずマッチする事がわかっている場合、手抜きする事は可能だ。

Regex#findFirstInメソッドを使う

if (pattern.findFirstIn(line).notEmpty) {
  val pattern(k, v) = line
  println(k)
  println(v)
}

findFirstInメソッドは引数に部分一致でマッチした文字列全部を返すので判定部分にしか使えない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment