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

Javaの正規表現\Dメタ文字とは?数字以外にマッチさせる方法を解説

Javaの正規表現におけるサブ表現(メタ文字)「\D」は、数字以外の文字(非数字)にマッチします。

「\D」は、数字1文字にマッチする「\d」と対になるメタ文字です。文字クラスで表すと「[^0-9]」と同等であり、英字・記号・空白など、0〜9以外のあらゆる文字にマッチします。

\Dに関連する主なメタ文字一覧

メタ文字意味
\d数字1文字([0-9]と同等)
\D数字以外の1文字([^0-9]と同等)
\s空白文字(スペース・タブ・改行など)
\S空白以外の1文字
\w単語構成文字([a-zA-Z_0-9]と同等)
\W単語構成文字以外の1文字

例1:\Dにマッチする文字数を数える

次の例では、パターン「\D」をPatternクラスでコンパイルし、入力文字列の中に数字以外の文字がいくつ含まれているかを、Matcherクラスのfind()メソッドを使って数えています。

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

public class RegexExample {
    public static void main(String args[]) {
        String regex = "\\D";
        String input = "This is sample text 12 24 56 89 24";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        int count = 0;
        while(m.find()) {
            count++;
        }
        System.out.println("マッチした数: " + count);
    }
}

実行結果

マッチした数: 24

この入力文字列には英字と空白が多数含まれているため、数字以外の文字が合計24個マッチしました。

例2:複数の文字列から非数字の文字数をカウントする

次の例では、Scannerクラスを使ってキーボードから5つの文字列を受け取り、それぞれの文字列に含まれる非数字の文字数を出力します。

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 = "\\D";
        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]);
            int count = 0;
            while(m.find()) {
                count++;
            }
            System.out.println("文字列" + i + ": " + count);
        }
    }
}

実行結果

5つの文字列を入力してください:
sample 1
12 35 36 63
test 243 663
hello
hello how are you *
各文字列の非数字文字数:
文字列0: 7
文字列1: 3
文字列2: 6
文字列3: 5
文字列4: 19

ポイントまとめ

  • 「\D」は数字以外の1文字にマッチします(「[^0-9]」「[^\d]」と同等)。
  • Javaではデフォルトで\dはASCIIの半角数字0〜9のみにマッチするため、全角数字(123など)は\D側にマッチすることに注意が必要です。
  • Pattern.compile()の第2引数にUNICODE_CHARACTER_CLASSフラグを指定すると、Unicodeの数字も\dにマッチするようになります。
  • 文字列中の特定パターンの出現回数を数える場合は、whileループでfind()を呼び出してカウントするのが定石です。
  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