Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのPattern.COMMENTSフィールドとは?使い方を実例付きで解説


JavaのPatternクラスが持つCOMMENTSフィールドは、正規表現パターンの中に空白文字やコメントを自由に記述できるようにするフラグです。このフラグをcompile()メソッドの第2引数として指定すると、パターン内の空白文字や、#記号で始まるコメント部分はすべて無視されてコンパイルされます。

複雑な正規表現を扱う場合、そのままでは読みにくくなりがちですが、COMMENTSフラグを活用すれば、各部分に説明用のコメントを付けたり、改行やインデントを使って整形したりできるため、可読性と保守性が大きく向上します。なお、このフラグは正規表現内に(?x)を埋め込む方法でも同等の効果が得られます。

例1:テキスト内の数字をカウントする

次の例では、ユーザーから入力された文字列に含まれる数字の個数を数えています。パターンには#で始まるコメントが含まれていますが、COMMENTSフラグにより無視され、正しく動作します。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class COMMENTS_Example {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        System.out.println("入力データを入力してください: ");
        String input = sc.nextLine();
        // 数字を検索する正規表現
        String regex = "\\d #このコメントは無視されます\n";
        // 正規表現をコンパイル(COMMENTSフラグを指定)
        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println("入力されたテキスト内の数字の個数: " + count);
    }
}

実行結果

入力データを入力してください:
sample1 text2 with3 numbers4 in5 between6
入力されたテキスト内の数字の個数: 6

パターン\dの後ろにある#ignore this commentのようなコメントは無視されるため、意図どおり数字だけがマッチ対象になっています。

例2:日付形式(MM/DD/YYYY)の妥当性チェック

次の例では、生年月日が「月/日/年」の形式として正しいかどうかを検証しています。長い正規表現を複数行に分け、各行にコメントを付けることで、内容がひと目で分かるようになっています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class COMMENTS_Example {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("名前を入力してください: ");
        String name = sc.nextLine();
        System.out.println("生年月日を入力してください: ");
        String dob = sc.nextLine();
        // MM/DD/YYYY形式の日付を受け付ける正規表現
        String regex = "^(1[0-2]|0[1-9])/"
                + "          # 月の部分\n"
                + "(3[01]|[12][0-9]|0[1-9])/"
                + "          # 日の部分\n"
                + "[0-9]{4}$ # 年の部分";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(dob);
        boolean result = matcher.matches();
        if (result) {
            System.out.println("入力された生年月日は有効です");
        } else {
            System.out.println("入力された生年月日は無効です");
        }
    }
}

実行結果

名前を入力してください:
Krishna
生年月日を入力してください:
09/26/1989
入力された生年月日は有効です

このように、Pattern.COMMENTSを使えば、月・日・年それぞれの検証条件にコメントを添えながら、整理された形で正規表現を記述できます。チーム開発などで正規表現を共有する際にも、意図が伝わりやすくなるため非常に便利です。

  1. 【Java入門】Pattern.CANON_EQフラグの使い方をサンプルコードで解説

    JavaのPatternクラスには、正規表現のマッチング動作を制御するためのさまざまなフラグが用意されています。そのひとつであるCANON_EQフィールドは、「正規化等価(canonical equivalence)」に基づいて文字を照合するためのフラグです。このフラグをcompile()メソッドに指定すると、2つの文字は完全な正準分解(canonical decomposition)の結果が等しい場合に限りマッチするとみなされます。ここでいう正準分解とは、Unicodeのテキスト正規化形式のひとつです。たとえば、アクセント記号付きの合成済み文字(1つのコードポイント)と、基本文字+結合文字(

  2. JavaのPatternクラスpattern()メソッドの使い方を実例で解説

    Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのクラスが多数用意されています。その中でもPatternクラスは、正規表現をコンパイルした結果を表すクラスであり、正規表現によるマッチング処理の出発点となる存在です。 このPatternクラスが提供するpattern()メソッドは、現在のパターンオブジェクトを生成する際に使用された正規表現そのものを、文字列(String)形式で取得して返します。 メソッドの構文 public String pattern() 引数は不要で、呼び出すだけでコンパイル済みの正規表現源文字列をそのまま受け取れ