例えば /([^:]+):[\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 _ => ()
}
この時のパターンは全文一致なので、部分一致を想定しているとマッチしない。
val pattern(k, v) = line
println(k)
println(v)
というやり方だとマッチしない場合、Exception が飛ぶ。 必ずマッチする事がわかっている場合、手抜きする事は可能だ。
if (pattern.findFirstIn(line).notEmpty) {
val pattern(k, v) = line
println(k)
println(v)
}
findFirstInメソッドは引数に部分一致でマッチした文字列全部を返すので判定部分にしか使えない。