修飾子の種類と指定方法

広告

修飾子を指定することで正規表現の基本動作を変更することができます。まずは修飾子の指定方法から確認していきます。

compileメソッドの引数に指定

1つ目の方法はパターンオブジェクトを作成する時に、compileメソッドの引数に指定することです。

指定されたフラグを使用して、指定された正規表現をパターンにコンパイルします。

パラメータ:
  regex - コンパイルされる表現
  flags - マッチフラグ。CASE_INSENSITIVE、MULTILINE、DOTALL、UNICODE_CASE、CANON_EQ、
    UNIX_LINES、LITERAL、および COMMENTS を含めることのできるビットマスク
例外:
  IllegalArgumentException - 定義済みマッチフラグに対応するビット値以外の値が flags に設
    定されている場合 
  PatternSyntaxException - 表現の構文が無効である場合

2番目の引数に修飾子を指定します。指定可能な値は次の通りです。

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

例えばPattern.CASE_INSENSITIVEを指定すると、大文字小文字を区別しないようになります。具体的には次のように記述します。

String regex = "good";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

各修飾子は同時に指定することが可能です。複数の修飾子を指定する場合は"|"で区切り続けて指定して下さい。具体的には次のように記述します。

String regex = "good";
Pattern p = Pattern.compile(regex, 
              Pattern.MULTILINE | Pattern.DOTALL | Pattern.UNIX_LINES);

埋め込みフラグで指定

2つ目の方法はパターンの中で埋め込みフラグを使用する方法です。埋め込みフラグは(?X)の形式で次のようなものが用意されています。

(?i)     Pattern.CASE_INSENSITIVE
(?m)     Pattern.MULTILINE
(?s)     Pattern.DOTALL
(?u)     Pattern.UNICODE_CASE
(?d)     Pattern.UNIX_LINES
(?x)     Pattern.COMMENTS

例えば(?i)はcompileメソッドの引数でPattern.CASE_INSENSITIVEを指定したのと同じ意味を持ちます。

埋め込みフラグはパターンの中に記述します。例として次のように記述します。

"(?i)hello"
"he(?i)llo"

埋め込みフラグは記述された以降のパターンに効果が出ます。"(?i)hello"の場合はパターンの先頭に"(?i)"が記述されていますのでそれ以降の全てにおいて"(?i)"が有効です。よって次のような文字列にマッチします。

"hello"
"Hello"
"heLLo"
"HELLO"

それに対して"he(?i)llo"はパターンの途中に"(?i)"が記述されています。その為、このフラグが有効になるのは"llo"の部分だけです。よって次のような文字列にマッチします。

"hello"
"heLLo"
"hellO"

また途中で埋め込みフラグの効果を無効にしたい場合は(?X)に対して(?-X)を記述します。例えば"(?i)"であれば"(?-i)"を使います。

"(?i)he(?-i)llo"

この場合、"(?i)"から"(?-i)"までの部分に埋め込みフラグが有効となります。よって次のような文字列にマッチします。

"hello"
"Hello"
"HEllo"

2つの方法のいずれかを使用することで正規表現の基本的な動作を変更することが可能です。では次のページ以降で各修飾子の使い方について確認していきます。

( Written by Tatsuo Ikura )