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

Java正規表現の\p{IsAlphabetic}で英字を判定・カウントする方法

Javaの正規表現には、特定の種類の文字に一致させるためのPOSIX文字クラスが用意されています。その中でも \p{IsAlphabetic} は、Unicodeの定義上「字母(アルファベット)」とみなされる文字に一致するパターンです。これを活用すると、文字列に含まれる英字のカウントや、英字を含む文字列の抽出などをシンプルなコードで実現できます。

例1:文字列に含まれる英字の数をカウントする

最初の例では、ユーザーが入力した文字列に対して \p{IsAlphabetic} を適用し、英字が何文字含まれているかを数えて表示します。

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

public class Example1 {
    public static void main(String args[]) {
        // ユーザーから文字列を入力してもらう
        System.out.println("文字列を入力してください");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();

        // 英字に一致する正規表現
        String regex = "\\p{IsAlphabetic}";

        // 正規表現をコンパイルしてPatternオブジェクトを生成
        Pattern pattern = Pattern.compile(regex);

        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);

        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println("英字の文字数: " + count);
    }
}

実行結果

文字列を入力してください
sample text
英字の文字数: 10

入力された「sample text」には10個の英字が含まれているため、「10」と出力されます。このように find() メソッドをループで回しながら一致した回数を数えることで、特定の種類の文字数を簡単に集計できます。

例2:英字を含む文字列だけを抽出する

次の例では、入力された複数の文字列の中から、英字を1文字でも含んでいるものだけを抽出して表示します。^.*\p{IsAlphabetic}.*$ という正規表現は、「先頭から末尾までの間に英字が含まれている」ことを意味します。

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

public class Example2 {
    public static void main(String args[]) {
        // 英字を含む文字列に一致する正規表現
        String regex = "^.*\\p{IsAlphabetic}.*$";

        // 5つの入力文字列を受け取る
        Scanner sc = new Scanner(System.in);
        System.out.println("5つの文字列を入力してください:");
        String input[] = new String[5];
        for (int i=0; i<5; i++) {
            input[i] = sc.nextLine();
        }

        // Patternオブジェクトを生成
        Pattern p = Pattern.compile(regex);

        System.out.println("英字を含む文字列:");
        for(int i=0; i<5; i++) {
            // Matcherオブジェクトを生成
            Matcher m = p.matcher(input[i]);
            if(m.matches()) {
                System.out.println(m.group());
            }
        }
    }
}

実行結果

5つの文字列を入力してください:
hello
sample
243test
##$$@
222356
英字を含む文字列:
hello
sample
243test

数字のみの「222356」や記号のみの「##$$@」は一致しないため除外され、英字を含む3つの文字列だけが出力されています。

\p{IsAlphabetic}を使う際のポイント

  • Unicode対応: \p{IsAlphabetic} はUnicodeの字母カテゴリに基づいて判定するため、半角英字(A〜Z、a〜z)だけでなく、アクセント付き文字(é など)やひらがな・カタカナ・漢字などの日本語文字にも一致します。
  • ASCIIのみに限定したい場合: 半角英字だけを対象にしたいときは、POSIX文字クラスの \p{Alpha} や文字クラスの [a-zA-Z] を使うとよいでしょう。
  • 動作環境: \p{IsAlphabetic} はJava 7以降で使用できます。内部的には Character.isAlphabetic() メソッドと同じ基準で判定されます。

このように \p{IsAlphabetic} を使えば、英字の判定処理を簡潔に記述できます。入力値のバリデーションや文字種チェックなど、さまざまな場面で活用してみてください。

  1. 【Java正規表現】POSIX文字クラス \p{Upper} で大文字英字をマッチングする方法

    POSIX文字クラス \p{Upper} は、大文字の英字(A〜Z)にマッチする正規表現パターンです。Javaの java.util.regex パッケージでは、Pattern クラスや Matcher クラスと組み合わせることで、「文字列がすべて大文字で構成されているかの検証」や「文字列に含まれる大文字の個数カウント」などを簡単に実装できます。 \p{Upper} の基本仕様 \p{Upper} は文字クラス [A-Z] とほぼ同等の働きをし、ASCII範囲の大文字アルファベット1文字にマッチします。Unicode全体を対象にしたい場合は \p{IsUppercase} や \p{Lu} を

  2. Java正規表現のPOSIX文字クラス \p{Lower}とは?小文字マッチの基本と実装例

    POSIX文字クラス \p{Lower} は、正規表現で小文字のアルファベット(a〜z)1文字にマッチさせるためのパターンです。Javaでは Pattern クラスと Matcher クラスを組み合わせて使うことで、「文字列がすべて小文字で構成されているか」の判定や「小文字がいくつ含まれているか」のカウントなど、さまざまなバリデーション処理に活用できます。例1:入力文字列がすべて小文字かどうかを判定する次のサンプルコードでは、正規表現 ^\p{Lower}+$(行頭から行末まで、すべて小文字アルファベット)を使用し、キーボードから入力された5つの文字列の中から、小文字のみで構成されている文字列