言いたいことはタイトルで全部言ってしまったので以下は蛇足です。
蛇足
ECMAScriptなどの言語では、正規表現リテラルが存在しており、リテラルと一緒に正規表現オプションを設定できる。
// xオプションを設定する const re = /(\d\d\d) - (\d\d\d\d)/x;
ところがScalaには正規表現リテラルはないので、.r
を使って文字列を正規表現にコンパイルしてから使う。
val Re = raw"(\d\d\d) - (\d\d\d\d)".r // ???
しかしRegex
クラスのどこにもオプションを設定するメソッドが無い。Scalaでは正規表現オプションは設定できないのか・・・?
もちろんそんなことはありません。こういうときはどうすれば良いかというと、正規表現の文字列リテラルの先頭で、(?フラグ)
と書けばよい。
val Re = raw"(?x)(\d\d\d) - (\d\d\d\d)".r "123-4567" match { case Re(a, b) => a -> b } // => ("123", "4567")
他言語の正規表現リテラルと比べるとちょっとダサい感じもするけれど、とりあえずこれで動くので覚えておく*2。