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

Java正規表現のPOSIX文字クラス\p{Space}とは?空白文字へのマッチ方法を実例付きで解説


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

Javaの正規表現におけるPOSIX文字クラス\p{Space}は、空白文字全般にマッチする便利な文字クラスです。このクラスがマッチ対象とするのは、次の6種類の文字です。

  • 半角スペース(U+0020)
  • \t … 水平タブ(U+0009)
  • \n … 改行(ラインフィード/U+000A)
  • \x0B … 垂直タブ(U+000B)
  • \f … フォームフィード(U+000C)
  • \r … キャリッジリターン(U+000D)

この文字クラスを活用すると、「文字列内の空白の数を数える」「空白を含む行だけを抽出する」といった処理を、個別のエスケープシーケンスを列挙することなくシンプルに実装できます。以下に代表的なサンプルコードを2つ紹介します。

例1:入力文字列に含まれる空白文字の数を数える

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

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

        // 空白文字にマッチする正規表現
        String regex = "[\\p{Space}]";

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

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

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

このプログラムでは、[\p{Space}]という正規表現をPattern.compile()でコンパイルし、Matcherのfind()メソッドによって文字列を先頭から順に走査しながら、空白文字が出現するたびにカウントを増やしていきます。

実行結果:

文字列を入力してください
space tab test
空白文字の数: 2

入力された「space tab test」には半角スペースが2つ含まれているため、結果として「2」が出力されます。

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

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{Space}.*$";

        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());
            }
        }
    }
}

この例では、^.*\p{Space}.*$という正規表現を使用しています。「行頭から任意の文字が続き、途中に空白文字が現れ、その後も任意の文字が続いて行末まで至る」というパターンを意味します。Matcherのmatches()メソッドは文字列全体との完全一致を判定するため、空白を1つでも含む文字列のみがマッチします。

実行結果:

5つの文字列を入力してください:
sample data
hello
welcome to tutorialspoint
12345
ab bc cd da
空白を含む文字列:
sample data
welcome to tutorialspoint
ab bc cd da

5つの入力のうち、「sample data」「welcome to tutorialspoint」「ab bc cd da」の3つが空白を含んでいたため、これらだけが出力されました。空白を含まない「hello」「12345」は除外されています。

まとめ

\p{Space}は、半角スペース・タブ・改行・フォームフィードなど、あらゆる空白文字をひとつのパターンで扱えるPOSIX文字クラスです。[\\t\\n\\x0B\\f\\r ]のように個別に列挙する必要がなく、コードの可読性と保守性が大きく向上します。空白文字のカウント、空白を含む文字列の抽出、入力値のバリデーションなど、テキスト処理のさまざまな場面で活用できるので、ぜひ覚えておきましょう。


  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つの文字列の中から、小文字のみで構成されている文字列