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) |
埋め込みフラグ表現で指定できないマッチフラグもあります。