Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scalaの正規表現でオプションを使うには文字列先頭で(?フラグ)と書く

言いたいことはタイトルで全部言ってしまったので以下は蛇足です。

蛇足

ECMAScriptなどの言語では、正規表現リテラルが存在しており、リテラルと一緒に正規表現オプションを設定できる。

// xオプションを設定する
const re = /(\d\d\d) - (\d\d\d\d)/x;

*1

ところが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

あわせて読みたい

jumble-note.blogspot.com

blog.3qe.us

*1:多くの正規表現エンジンでは、xフラグでスペースや改行を無視させるオプションが有効化される。

*2:Scalaは正規表現リテラルを実装してほしいなぁ

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?