Java正規表現のPOSIX文字クラス \p{Punct} の使い方を解説
POSIX文字クラス \p{Punct} は、句読点(記号)にマッチする文字クラスです。具体的には、以下のASCII記号が対象となります。
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
この記事では、\p{Punct} を使った実際のJavaコード例を2つ紹介します。文字列中の記号の個数を数える方法と、記号のみで構成された文字列を抽出する方法です。
例1:文字列内の記号の個数を数える
次のプログラムは、ユーザーから入力された文字列に対して正規表現 [\p{Punct}] を適用し、含まれる記号の総数を出力します。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AlphanumericExample {
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{Punct}]";
// 正規表現をコンパイル
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトを取得
Matcher matcher = pattern.matcher(input);
int count = 0;
while(matcher.find()) {
count++;
}
System.out.println("Number of punctuation marks: "+count);
}
}実行結果
Enter a string Hello, how are you. Welcome to Tutorialspoint. Number of punctuation marks: 3
入力された文字列には「,」「.」「.」の3つの記号が含まれているため、カウント結果は 3 となります。
例2:記号のみで構成された文字列を抽出する
次のプログラムは、5つの入力文字列の中から、正規表現 ^\p{Punct}+$ に完全一致する(つまり記号だけで構成されている)文字列だけを表示します。
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{Punct}+$";
// 入力データを取得
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 punctuation 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 1234 123text.!! !!!!! ..!!,, Strings with only punctuation characters: !!!!! ..!!,,
実行結果からわかるように、「hello」や「1234」、「123text.!!」のような英数字を含む文字列はマッチせず、「!!!!!」と「..!!,,」という記号のみの文字列だけが出力されています。
まとめ
\p{Punct}はASCIIの句読点・記号にマッチするPOSIX文字クラスである。- 文字クラス
[\p{Punct}]として使えば、文字列中の各記号を個別に検出できる。 - アンカー
^と$を組み合わせた^\p{Punct}+$をmatches()で使えば、文字列全体が記号のみかどうかを判定できる。
-
【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} を
-
Java正規表現のPOSIX文字クラス \p{Lower}とは?小文字マッチの基本と実装例
POSIX文字クラス \p{Lower} は、正規表現で小文字のアルファベット(a〜z)1文字にマッチさせるためのパターンです。Javaでは Pattern クラスと Matcher クラスを組み合わせて使うことで、「文字列がすべて小文字で構成されているか」の判定や「小文字がいくつ含まれているか」のカウントなど、さまざまなバリデーション処理に活用できます。例1:入力文字列がすべて小文字かどうかを判定する次のサンプルコードでは、正規表現 ^\p{Lower}+$(行頭から行末まで、すべて小文字アルファベット)を使用し、キーボードから入力された5つの文字列の中から、小文字のみで構成されている文字列