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

【Java】正規表現のPOSIX文字クラス\p{Graph}で可視文字を判定する方法

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

Javaの正規表現で利用できる\p{Graph}は、POSIX文字クラスの一つです。英字・数字・句読点・記号など、半角スペースを除くすべての可視文字にマッチします。ただし、デフォルトではASCII文字(0x21〜0x7E)が対象となるため、アクセント付き文字などの非ASCII文字にはマッチしない点に注意してください。

例1:入力文字列から可視文字を数える

次の例では、ユーザーが入力した文字列に対して正規表現"[\p{Graph}]"を適用し、マッチした文字(可視文字)の個数をカウントしています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VisibleCharacters {
    public static void main(String args[]) {
        // ユーザーから文字列を読み込む
        System.out.println("Enter a string");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // 正規表現
        String regex = "[\\p{Graph}]";
        // 正規表現をコンパイル
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println("Number of visible characters: "+count);
    }
}

出力1

Enter a string
öäü çã Ã test
Number of visible characters: 4

入力された「öäü çã Ã test」のうち、アクセント付き文字(ö、ä、ü、ç、ã、Ã)はASCII範囲外のためマッチ対象とならず、最後の「test」の4文字だけがカウントされています。

出力2

Enter a string
welcome to tutorialspoint
Number of visible characters: 23

一方、「welcome to tutorialspoint」の場合は、半角スペース2つを除く23文字すべてが可視文字としてカウントされました。

例2:可視文字だけで構成された文字列を判定する

続く例では、正規表現"^\p{Graph}+$"を使って、入力された5つの文字列のうち「可視文字のみで構成されている文字列」だけを抽出しています。

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{Graph}+$";
        // 入力データの取得
        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 visible characters: ");
        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öäüçãÃ
öäüçãÃ
Hello1234
1234
welcome
Strings with only visible characters:
Hello1234
1234
welcome

この実行結果から分かるように、アクセント付き文字を含む2つの文字列はマッチせず、「Hello1234」「1234」「welcome」の3つだけが出力されました。これは、デフォルトの\p{Graph}がASCII文字のみを対象としているためです。

補足:Unicode文字にも対応させたい場合

日本語やアクセント付きラテン文字なども可視文字として扱いたい場合は、Pattern.compile()の第2引数にPattern.UNICODE_CHARACTER_CLASSフラグを指定します。このフラグを有効にすると、\p{Graph}はUnicodeの定義に基づいて可視文字を判定するようになります。

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