Java正規表現のPOSIX文字クラス \p{ASCII} の使い方を解説
\p{ASCII}は、Java正規表現で利用できるPOSIX文字クラスの一つです。このクラスはASCII文字(\x00~\x7F)にマッチします。
ASCII文字とは、コードポイント0~127に割り当てられた半角の英数字・記号・空白・制御文字などのことです。そのため、ひらがな・カタカナ・漢字といった全角文字や、éのようなアクセント付きラテン文字はマッチしません。
主なPOSIX文字クラス
\p{ASCII}とあわせて覚えておくと便利な、主なPOSIX文字クラスは以下のとおりです。
\p{Alpha}… 英字(A~Z、a~z)\p{Digit}… 数字(0~9)\p{Alnum}… 英数字\p{Upper}/\p{Lower}… 大文字/小文字の英字\p{Space}… 空白文字\p{Punct}… 句読点などの記号
サンプルプログラム
次の例では、ユーザーが入力した文字列に含まれるASCII以外の文字の個数を数えます。否定文字クラス[^\p{ASCII}]を使うことで、「ASCII文字以外の1文字」にマッチさせています。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// ユーザーから文字列を読み込む
System.out.println("文字列を入力してください");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 正規表現:ASCII以外の文字にマッチさせる
String regex = "[^\\p{ASCII}]";
// 正規表現をコンパイルしてMatcherオブジェクトを取得
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// マッチした件数(=ASCII以外の文字数)をカウント
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("ASCII以外の文字数:" + count);
}
}実行結果
文字列を入力してください Hello 世界 ASCII以外の文字数:2
コードのポイント
Pattern.compile()で正規表現をコンパイルし、pattern.matcher(input)で入力文字列に対するMatcherオブジェクトを取得します。find()は、マッチするたびに次の一致位置へ進みながらtrueを返します。whileループで繰り返し呼び出すことで、マッチした文字の総数をカウントできます。- 逆にASCII文字の個数を数えたい場合は、パターンを
[\p{ASCII}]に変更するだけで対応できます。
なお、文字列全体がASCII文字のみで構成されているかどうかを判定したい場合は、matches("\\p{ASCII}*")のように書くと簡潔に実装できます。
-
Javaの正規表現(RegEx)で非単語文字をマッチさせる方法をわかりやすく解説
Javaの正規表現では、英字(大文字・小文字の両方)および数字(0〜9)以外のすべての文字が「非単語文字(non-word character)」として扱われます。記号や空白などがこれに該当します。こうした文字をマッチさせたい場合は、メタ文字 \W を使用します。なお、\W は文字クラス [^a-zA-Z0-9_] と同等の意味を持ちます。注意点として、アンダースコア(_)は単語文字に含まれるため、\W にはマッチしません。例1:PatternクラスとMatcherクラスを使った方法先頭から5文字がすべて非単語文字であるかどうかを判定する例です。正規表現 ^\W{5} を使って、入力文字列の冒
-
Java正規表現(RegEx)で任意の文字にマッチさせる方法
Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j