Scala の正規表現でマッチフラグを使うには


Scala での正規表現

Scala での正規表現は、scala.util.matching.Regex を使って、

val Decimal = new Regex("""(-)?(\d+)(\.\d*)?""")

または StringLike の r を使って

val Decimal = """(-)?(\d+)(\.\d*)?""".r

のように指定できます。
scala.util.matching.Regex は内部で Java正規表現クラスを使用しています。

Java での正規表現

Java では正規表現パターンを以下のスタティックメソッドにて指定します。

public static Pattern compile(String regex)
public static Pattern compile(String regex, int flags)

2 つ目の compile メソッドには、第2引数にてマッチフラグが指定できるようになっています。マッチフラグには以下のものがあります。

マッチフラグ 意味
CANON_EQ 正規等価を有効にします。
CASE_INSENSITIVE 大文字と小文字を区別しないマッチングを有効にします。
COMMENTS パターン内で空白とコメントを使用できるようにします。
DOTALL DOTALL モードを有効にします。
LITERAL パターンのリテラル構文解析を有効にします。
MULTILINE 複数行モードを有効にします。
UNICODE_CASE Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。
UNIX_LINES Unix ラインモードを有効にします。


マッチフラグの指定は compile メソッドで指定できます。

Pattern.compile("pattern", Pattern.MULTILINE | Pattern.DOTALL);

Scala でマッチフラグを指定

該当するメソッドが scala.util.matching.Regex とかに見当たらないので諦めていましたが、そもそも Java 側に「埋め込みフラグ表現」として解決策がありました。正規表現のパターン文字列中に (?i) 等でフラグを埋め込めるということです。・・知りませんでした。

JavaDoc にも普通に書いてありました。

(?idmsux-idmsux) 正規表現ではないが、マッチフラグ i、d、m、s、u、x のオン/オフを切り替える
(?idmsux-idmsux:X) X、前方参照を行わないグループ。指定されたフラグ i、d、m、s、u、x のオン/オフを切り替える

ということで、以下の2つは同等となります。

Pattern.compile("pattern", Pattern.MULTILINE | Pattern.DOTALL);
Pattern.compile("(?ms)pattern");

前方参照を行わないグループとして指定するには

Pattern.compile("(?ms:pattern)");


つまりは Scala でも以下で済むのですね。。

val PatternRE = """(?ms)pattern""".r


ということで、埋め込みフラグ表現をまとめると、

マッチフラグ 意味 埋め込みフラグ表現
CANON_EQ 正規等価を有効にします。 なし
CASE_INSENSITIVE 大文字と小文字を区別しないマッチングを有効にします。 (?i)
COMMENTS パターン内で空白とコメントを使用できるようにします。 (?x)
DOTALL DOTALL モードを有効にします。 (?s)
LITERAL パターンのリテラル構文解析を有効にします。 なし
MULTILINE 複数行モードを有効にします。 (?m)
UNICODE_CASE Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。 (?u)
UNIX_LINES Unix ラインモードを有効にします。 (?d)

埋め込みフラグ表現で指定できないマッチフラグもあります。