正規表現でフラグを有効にする

正規表現ではフラグ(またはオプション修飾子)を設定することでパターンが文字列にマッチする仕組みを変更することができます。ここでは Java で設定可能なフラグの種類と、フラグを有効にする手順について解説します。

(Last modified: )

Javaの正規表現で利用可能なフラグの一覧

Java の正規表現で利用可能なフラグの一覧は次のとおりです。(Java SE 15)

修飾子埋め込みフラグ説明
Pattern.CASE_INSENSITIVE(?i)大文字と小文字を区別しないマッチングを有効にする
Pattern.MULTILINE(?m)複数行モードを有効にする
Pattern.DOTALL(?s)DOTALL モードを有効にする
Pattern.UNICODE_CASE(?u)Unicode に準拠した大文字と小文字を区別しないマッチングを有効にする
Pattern.UNICODE_CHARACTER_CLASS(?U)定義済みの文字クラスとPOSIX文字クラスのUnicodeバージョンを使用可能にする
Pattern.CANON_EQ--正規等価を有効にする
Pattern.UNIX_LINES(?d)Unix ラインモードを有効にする
Pattern.LITERAL--パターンのリテラル構文解析を有効にする
Pattern.COMMENTS(?x)パターン内で空白とコメントを使用できるようにする

フラグを有効にすることでデフォルトの動作を変更することができます。例えばデフォルトではドット(.)は \n などの行末文字にはマッチしませんが、 Pattern.DOTALL フラグを有効にするとドット(.)が行末文字にもマッチするようになります。

それぞれのフラグの具体的な利用方法は次のページ以降でそれぞれ解説します。

compile?メソッドの引数に指定してフラグを有効にする

フラグを有効にする手順は 2 つあります。 1 つ目は Pattern オブジェクトを作成するときに使用する compile メソッドの 2 番目の引数で修飾子を指定する方法です。

public static Pattern compile(String regex, int flags)

パラメータ:
regex - コンパイルされる表現
flags - マッチ・フラグ。CASE_INSENSITIVE、MULTILINE、DOTALL、UNICODE_CASE、CANON_EQ, UNIX_LINES、LITERAL、UNICODE_CHARACTER_CLASS、およびCOMMENTSを含めることができるビット・マスク

戻り値:
指定されたフラグを使用して、パターンにコンパイルする指定された正規表現

例外:
IllegalArgumentException - 定義済みマッチ・フラグに対応するビット値以外の値がflagsに設定されている場合
PatternSyntaxException - 表現の構文が無効である場合

1 番目の引数に文字列で定義したパターンを記述します。そして 2 番目の引数に有効にしたいフラグを指定します。戻り値として Pattern クラスのインスタンスを取得できます。

例えば DOTALL フラグを有効にしてパターンオブジェクトを作成する場合は次のように記述します。

String r = "A.*B";
Pattern p = Pattern.compile(r, Pattern.DOTALL);

またフラグは同時に有効にすることができます。複数のフラグを同時に有効にする場合は | で区切って続けて記述してください。

String r = "A.*B";
Pattern p = Pattern.compile(r, Pattern.DOTALL | Pattern.MULTILINE);

このように compile メソッドの引数としてフラグを指定する場合は、パターン全体に対してフラグが有効となります。

パターンの中に埋め込みフラグを記述する

フラグを有効にする二つ目の方法は、パターンを表す文字列の中に埋め込みフラグを記述する方法です。埋め込みフラグは用意されているフラグとされていないフラグがあり、用意されているものは次の 7 つです。

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

埋め込みフラグは、パターンを表す文字列の中の任意の位置に記述することができます。記述した位置よりあとのパターンに対してフラグが有効となります。

例えば CASE_INSENSITIVE フラグを有効にしてパターンオブジェクトを作成する場合は次のように記述します。

String r = "(?i)milkpan";
Pattern p = Pattern.compile(r);

今回はパターンの先頭に (?i) を記述しているのでパターン全体に対して CASE_INSENSITIVE フラグが有効となります。

パターン文字列の途中に埋め込むフラグを記述した場合、埋め込みフラグが記述された以降のパターンにのみフラグが有効となります。例えば次のように記述します。

String r = "milk(?i)pan";
Pattern p = Pattern.compile(r);

今回はパターンの中の pan の部分だけ CASE_INSENSITIVE フラグが有効となります。

有効になっているフラグを途中から無効にする場合は、 (?x) で有効にしたフラグを (?-x) で無効にすることができます。例えば次のように記述します。

String r = "(?i)milk(?-i)pan";
Pattern p = Pattern.compile(r);

今回はパターンの中の milk の部分だけ CASE_INSENSITIVE フラグが有効となります。

パターンの中で複数の埋め込みフラグを記述することもできます。

String r = "(?i)(?s)milkpan";
Pattern p = Pattern.compile(r);

具体的なサンプルは次のページ以降をご参照ください。

-- --

Java で設定可能なフラグの種類と、フラグを有効にする手順について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。