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

【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} を使うとよいでしょう。

例1:すべて大文字の文字列だけを抽出する

次の例では、正規表現 ^\\p{Upper}+$ を使って、ユーザーが入力した5つの文字列のうち、すべて大文字英字だけで構成されている文字列を出力します。

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

public class Posix_UpperExample {
    public static void main(String args[]) {
        // 大文字英字のみにマッチする正規表現
        String regex = "^\\p{Upper}+$";
        // 入力データの取得
        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つの文字列を入力してください:
RAJU
RAMU
RamANi
raghav#
madhavi**
すべて大文字で構成された文字列:
RAJU
RAMU

「RamANi」「raghav#」「madhavi**」は小文字や記号を含むためマッチせず、「RAJU」と「RAMU」だけが出力されています。

例2:文字列に含まれる大文字の個数を数える

次の例では、find() メソッドを使って文字列内の大文字を1文字ずつ走査し、その出現回数をカウントします。

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

public class Example {
    public static void main(String args[]) {
        // ユーザーから文字列を読み込む
        System.out.println("文字列を入力してください");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // 正規表現の定義
        String regex = "\\p{Upper}";
        // 正規表現をコンパイル
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println("入力された文字列に含まれる大文字の数: " + count);
    }
}

実行結果1

文字列を入力してください
Hello How Are You
入力された文字列に含まれる大文字の数: 4

実行結果2

文字列を入力してください
WELCOME TO TUTORILASPOINT
入力された文字列に含まれる大文字の数: 23

ポイント解説

  • ^\\p{Upper}+$:先頭(^)から末尾($)まで、1文字以上の大文字英字のみで構成されている場合にマッチします。
  • matches():文字列全体がパターンと完全に一致するかどうかを判定します。
  • find():文字列内を順次走査し、パターンに一致する部分を見つけるたびに true を返します。カウント処理に便利です。
  • 注意点\p{Upper} はASCIIのA〜Zのみ対象です。全角文字やアクセント付き文字なども含めたい場合は、フラグ Pattern.UNICODE_CHARACTER_CLASS を指定するか、\p{IsUppercase} を利用してください。
  1. Javaの正規表現(RegEx)で非単語文字をマッチさせる方法をわかりやすく解説

    Javaの正規表現では、英字(大文字・小文字の両方)および数字(0〜9)以外のすべての文字が「非単語文字(non-word character)」として扱われます。記号や空白などがこれに該当します。こうした文字をマッチさせたい場合は、メタ文字 \W を使用します。なお、\W は文字クラス [^a-zA-Z0-9_] と同等の意味を持ちます。注意点として、アンダースコア(_)は単語文字に含まれるため、\W にはマッチしません。例1:PatternクラスとMatcherクラスを使った方法先頭から5文字がすべて非単語文字であるかどうかを判定する例です。正規表現 ^\W{5} を使って、入力文字列の冒

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

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