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

Javaの正規表現(RegEx)で式のn回の出現にマッチさせる方法

Java正規表現における量指定子(Quantifier)の基本

Javaの正規表現API(java.util.regex)が提供する貪欲な量指定子(greedy quantifiers)を利用すると、ある式が繰り返し出現するパターンに簡単にマッチさせることができます。主な量指定子は以下の3種類です。

  • Exp{n} … 式 exp がちょうど n 回出現することを表します。
  • Exp{n} … 式 exp が少なくとも n 回出現することを表します。
  • Exp{n, m} … 式 exp が最低 n 回、最大 m 回出現することを表します。

以下では、これらの量指定子の使い方を3つの具体例で解説します。

例1:{n} で「ちょうどn回」の出現にマッチさせる

最初の例では、正規表現 \w{5} を使って「5文字の単語」を判定するプログラムを紹介します。キーボードから5つの文字列を入力し、それぞれが条件を満たすかどうかを出力します。

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

public class RegexExample {
    public static void main(String args[]) {
        // 5文字の単語を受け入れる正規表現
        String regex = "\\w{5}";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter 5 input strings: ");
        String input[] = new String[5];
        for (int i = 0; i < 5; i++) {
            input[i] = sc.nextLine();
        }
        // Patternオブジェクトの生成
        Pattern p = Pattern.compile(regex);
        for (int i = 0; i < 5; i++) {
            // Matcherオブジェクトの生成
            Matcher m = p.matcher(input[i]);
            if (m.find()) {
                System.out.println(input[i] + ": accepted");
            } else {
                System.out.println(input[i] + ": not accepted");
            }
        }
    }
}

ここでは find() メソッドを使っているため、文字列中のどこかに5文字連続した単語構成文字(英数字・アンダースコア)があればマッチとみなされます。4文字の「rama」「raja」は拒否され、5文字以上の「raghu」「megha」「malya」は受け入れられます。

実行結果

Enter 5 input strings:
rama
raja
raghu
megha
malya
rama: not accepted
raja: not accepted
raghu: accepted
megha: accepted
malya: accepted

例2:{n, m} で出現回数の範囲を指定する

次の例では、正規表現 \W{2,6} を使用します。\W は「単語構成文字以外」(記号や空白など)に対応するため、このパターンは「長さ2〜6の非単語文字の連続」にマッチします。

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

public class RegexExample {
    public static void main(String args[]) {
        // 長さ2〜6の非単語文字列にマッチする正規表現
        String regex = "\\W{2,6}";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter 5 input strings: ");
        String input[] = new String[5];
        for (int i = 0; i < 5; i++) {
            input[i] = sc.nextLine();
        }
        // Patternオブジェクトの生成
        Pattern p = Pattern.compile(regex);
        for (int i = 0; i < 5; i++) {
            // Matcherオブジェクトの生成
            Matcher m = p.matcher(input[i]);
            if (m.find()) {
                System.out.println(input[i] + " matched");
            }
        }
    }
}

英字だけで構成された文字列には \W に該当する文字が2つ以上連続して存在しないためマッチしませんが、記号を多く含む文字列はマッチ対象になります。

実行結果

Enter 5 input strings:
hello how are you
#$#%
#
#$@%%#&#&
sample text
#$#% matched
#$@%%#&#& matched

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

最後の例は、正規表現 [a-zA-Z]{1,20} を使った実践的なバリデーションです。「1〜20文字のアルファベットのみ」で構成された名前かどうかを検証します。ここでは matches() メソッドを使用しており、これは文字列全体がパターンに一致する場合にのみ true を返す点に注意してください。

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

public class RegexExample {
    public static void main(String args[]) {
        String regex = "[a-zA-Z]{1,20}";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter students name:");
        String name = sc.nextLine();
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(name);
        if (m.matches()) {
            System.out.println("Name is appropriate");
        } else {
            System.out.println("Name is inappropriate");
        }
    }
}

入力された「Mouktika」は8文字すべてがアルファベットであるため、条件に適合する名前と判定されます。

実行結果

Enter students name:
Mouktika
Name is appropriate

まとめ

Javaの正規表現では、量指定子 {n}{n}{n, m} を使い分けることで、式の出現回数を柔軟に制御できます。さらに、find() が「部分一致」、matches() が「完全一致」を判定するという違いも理解しておくと、目的に応じた文字列検証を正確に実装できます。

  1. Java正規表現(Regex)で固定文字セットにマッチさせる方法

    Javaの正規表現における文字クラスを使うと、あらかじめ定義しておいた固定の文字集合の中から「任意の1文字」にマッチさせることができます。たとえば、次のように記述します。 [tmp]:t、m、p のいずれか1文字にマッチします。 [^tp]:t と p 以外の任意の1文字にマッチします(先頭に ^ を付けると否定を意味します)。 角括弧 [ ] 内に候補となる文字を列挙すると、入力文字列の各位置についてその中のどれか1つが存在すればマッチが成立します。この仕組みを利用すると、「特定の文字が文字列内に何回出現するか」を簡単に数えることができます。 例1:指定した文字の出現回数をカウントする

  2. Java正規表現(RegEx)で任意の文字にマッチさせる方法

    Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j