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

Java正規表現のPOSIX文字クラス「\p{Sc}」で通貨記号をマッチングする方法

POSIX文字クラスの一つである \p{Sc} は、通貨記号にマッチします。ドル記号($)、ユーロ記号(€)、ポンド記号(£)、円記号(¥)など、Unicodeで定義されている各種通貨記号を検出したい場合に便利です。

この記事では、Javaの正規表現で \p{Sc} を使って、文字列中の通貨記号をカウントする方法と、通貨記号を含む文字列を抽出する方法を、実行可能なサンプルコード付きで解説します。

例1:文字列中の通貨記号をカウントする

以下の例では、ユーザーが入力した文字列に含まれる通貨記号の数を数えています。Pattern.compile() で正規表現をコンパイルし、Matcher.find() を繰り返し呼び出すことで、マッチした箇所を順番に数えています。

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

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

実行結果

文字列を入力してください
euro €, pounds £, dollar $, yen ¥
通貨記号の数: 4

入力文字列には €、£、$、¥ の4つの通貨記号が含まれているため、出力は「4」となります。

例2:通貨記号を含む文字列だけを抽出する

次の例では、複数の入力文字列の中から、通貨記号を1つ以上含む文字列だけを抽出しています。正規表現 ^.*\p{Sc}.*$ は、「行の先頭から末尾までの間に通貨記号が含まれる」という条件を表しています。

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

public class Example2 {
    public static void main(String args[]) {
        // 通貨記号を含む文字列にマッチする正規表現
        String regex = "^.*\\p{Sc}.*$";
        // 入力データを取得
        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つの文字列を入力してください:
hello
sample
243test
# #$$@
£shelling
通貨記号を含む文字列:
# #$$@
£shelling

この例では、「hello」「sample」「243test」には通貨記号が含まれていないため除外され、$ や £ を含む2つの文字列のみが出力されています。

ポイントまとめ

  • \p{Sc} はUnicodeの「Symbol, currency(通貨記号)」カテゴリに属する文字すべてにマッチします。
  • Javaのコード内で正規表現を記述する際は、バックスラッシュをエスケープして "\\p{Sc}" のように書く必要があります。
  • 特定の通貨記号だけを対象にしたい場合は、[\$€£¥] のような文字クラスを使う方法もあります。
  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つの文字列の中から、小文字のみで構成されている文字列