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

Javaの正規表現re{n,m}メタ文字の使い方とサンプルコード解説


Javaの正規表現における部分式(メタ文字)「re{n, m}」は、直前の式がn回以上・m回以下で繰り返される場合にマッチする量指定子です。これを利用することで、繰り返し回数の最小値と最大値を柔軟に制御できます。

例1:re{n, m}の基本的な動作

次のJavaプログラムでは、「xyy{2,4}」という正規表現を使い、入力文字列の中に条件に合致する箇所がいくつあるかをカウントしています。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
    public static void main( String args[] ) {
        String regex = "xyy{2,4}";
        String input = "xxyyzxxyyyyxyyzxxyyzz";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        int count = 0;
        while(m.find()) {
            count++;
        }
        System.out.println("マッチ数:" + count);
    }
}

実行結果

マッチ数: 1

このパターンは「x」の直後に「y」が2回〜4回続く文字列にマッチします。入力文字列「xxyyzxxyyyyxyyzxxyyzz」の中で条件を満たすのは「xyyyy」(xの後にyが4回続く部分)の1箇所だけなので、結果は「1」となります。

例2:名前の入力チェックへの応用

次のJavaプログラムは、ユーザーから名前を入力として受け取り、1文字以上20文字以内の英字のみで構成されているかどうかを検証する例です。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
    public static void main(String args[] ) {
        // 1文字以上20文字以下の英字にマッチする正規表現
        String regex = "[a-zA-Z]{1,20}";
        Scanner sc = new Scanner(System.in);
        System.out.println("学生の名前を入力してください:");
        String name = sc.nextLine();
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(name);
        if(m.matches()) {
            System.out.println("名前は適切です");
        } else {
            System.out.println("名前は不適切です");
        }
    }
}

実行結果1

学生の名前を入力してください:
Mouktika
名前は適切です

「Mouktika」は8文字の英字だけで構成されているため、条件を満たしています。

実行結果2

学生の名前を入力してください:
ka 34
名前は不適切です

「ka 34」には数字と空白が含まれているため、英字のみという条件に合致せず、不適切と判定されます。

実行結果3

学生の名前を入力してください:
Sri Veera Venkata Satya Sai Suresh Santosh Samrat
名前は不適切です

この名前は英字数が上限の20文字を超えているため、やはり不適切と判定されます。

まとめ

「re{n, m}」は、繰り返し回数に下限と上限を設けたい場合に便利な量指定子です。フォームの入力バリデーションやデータ形式のチェックなど、実務でも幅広く活用できます。なお、下限のみを指定したい場合は「{n}」のように記述することも可能です。


  1. Javaの正規表現における$(ドル)メタ文字の使い方

    正規表現におけるサブ表現(メタ文字)「$」は、行の末尾に一致します。パターンの最後に「$」を置くことで、指定した文字列で終わるテキストだけをマッチさせることができます。なお、デフォルトでは「$」は入力全体の末尾に一致しますが、Pattern.MULTILINEフラグを有効にすると、行区切り文字(改行など)の直前にも一致するようになります。例1:行末の一致を確認する次のJavaプログラムでは、「Tutorialspoint」という文字列で終わる入力に対して、正規表現「Tutorialspoint$」が何回一致するかを数えています。import java.util.regex.Matcher; i

  2. Java正規表現のメタ文字「^(キャレット)」の使い方を解説

    正規表現におけるサブ式(メタ文字)「^」は、行の先頭にマッチします。この記号を正規表現の中で使用すると、入力文字列の中でその後に続くパターンが行頭から始まる場合に一致とみなされます。 例1:行頭のパターンにマッチするか確認する 次のサンプルコードでは、入力文字列が「Hi how are you」というフレーズで始まっているかどうかを「^」を使って判定しています。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void m