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

【Java正規表現】POSIX文字クラス \p{Digit} の使い方を徹底解説

POSIX文字クラス \p{Digit} とは

Javaの正規表現におけるPOSIX文字クラス \p{Digit} は、10進数の数字「0」から「9」にマッチするパターンです。文字列の中から数字だけを抽出したり、入力値が数字のみで構成されているかどうかを判定したりする際に便利です。

なお、\p{Digit} は文字クラス [0-9]\d とほぼ同じ働きをしますが、POSIX形式で記述することでコードの意図が明確になり、可読性が向上するというメリットがあります。

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

次のサンプルでは、ユーザーから入力された文字列に対して \p{Digit} を適用し、含まれる数字の個数をカウントしています。

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

public class DigitsExample {
    public static void main(String args[]) {
        // ユーザーから文字列を読み込む
        System.out.println("Enter a string");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();

        // 正規表現(数字1文字にマッチ)
        String regex = "[\\p{Digit}]";

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

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

        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println("Number of digits: "+count);
    }
}

実行結果1

Enter a string
sample text 22 37 48 84
Number of digits: 8

この例では、入力文字列中に数字が8個(2、2、3、7、4、8、8、4)含まれているため、「8」と出力されます。

実行結果2

Enter a string
Welcome to tutorilspoint
Number of digits: 0

数字が一切含まれていない文字列の場合は「0」と出力されます。

例2:数字のみで構成された文字列を判定する

次のサンプルでは、^\p{Digit}+$ という正規表現を使用し、先頭から末尾まで数字のみで構成された文字列だけを抽出しています。行頭・行末を表すアンカー ^$ を組み合わせることで、部分一致ではなく完全一致での判定が可能になります。

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

public class Example {
    public static void main( String args[] ) {
        // 数字のみにマッチする正規表現
        String regex = "^\\p{Digit}+$";

        // 入力データを取得
        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);

        System.out.println("Strings with only digits: ");
        for(int i=0; i<5;i++) {
            // Matcherオブジェクトを作成
            Matcher m = p.matcher(input[i]);
            if(m.matches()) {
                System.out.println(m.group());
            }
        }
    }
}

実行結果

Enter 5 input strings:
hello
1234
243test
##$$@
222356
Strings with only digits:
1234
222356

5つの入力文字列のうち、「hello」「243test」「##$$@」には英字や記号が含まれるためマッチせず、数字のみの「1234」と「222356」だけが出力されています。

まとめ

  • \p{Digit} は0〜9の10進数字1文字にマッチするPOSIX文字クラスである。
  • [\p{Digit}] のように使えば文字列内の数字を検索・カウントできる。
  • ^\p{Digit}+$ のようにアンカーと組み合わせれば、文字列全体が数字のみかどうかを判定できる。
  • 動作は \d[0-9] と同等だが、POSIX形式は意図が伝わりやすく可読性に優れる。
  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つの文字列の中から、小文字のみで構成されている文字列