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

JavaのPatternSyntaxExceptionクラスとは?正規表現の構文エラー処理方法を解説


PatternSyntaxException クラスは、正規表現(regex)の文字列に構文エラーが含まれている場合にスローされる非検査例外(unchecked exception)です。この例外は java.util.regex パッケージに属しており、Pattern.compile() メソッドなどで不正な正規表現をコンパイルしようとした際に発生します。

このクラスには、エラーの詳細情報を取得するための主要なメソッドが用意されています。

  • getDescription() − エラーの説明(description)を返します。

  • getIndex() − エラーが発生した位置のインデックスを返します。

  • getPattern() − エラーが含まれている正規表現パターンそのものを返します。

  • getMessage() − エラーの説明、インデックス、エラーのある正規表現パターン、およびパターン内のエラー箇所を示す記号(^)を含む完全なメッセージを返します。

これらのメソッドを活用することで、ユーザーに対して「どの部分の正規表現が間違っているのか」を分かりやすく伝えることができます。

サンプルコード

以下は、ユーザーから入力された文字列に対して正規表現を適用する例です。ここでは意図的に不正な正規表現 [ を使用し、PatternSyntaxException をキャッチして各メソッドの出力を確認しています。

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

public class PatternSyntaxExceptionExample {
    public static void main(String args[]) {
        // ユーザーから文字列を読み込む
        System.out.println("Enter a String");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();

        // 正規表現(意図的に不正なパターンを指定)
        String regex = "["; //\s+

        // 正規表現をコンパイル
        try {
            Pattern pattern = Pattern.compile(regex);
            // Matcherオブジェクトを取得
            Matcher matcher = pattern.matcher(input);
            // 余分な空白を1つの空白に置換
            String result = matcher.replaceAll(" ");
            System.out.print("Text after removing unwanted spaces: \n" + result);
        } catch(PatternSyntaxException ex) {
            System.out.println("Description: " + ex.getDescription());
            System.out.println("Index: " + ex.getIndex());
            System.out.println("Message: " + ex.getMessage());
            System.out.println("Pattern: " + ex.getPattern());
        }
    }
}

実行結果

Enter a String
this is a [sample text [
Description: Unclosed character class
Index: 0
Message: Unclosed character class near index 0
[
^
Pattern: [

解説

この例では、正規表現として閉じられていない文字クラス [ を指定しているため、Pattern.compile() の呼び出し時に PatternSyntaxException がスローされます。catch ブロック内で各メソッドを呼び出すことで、以下の情報が出力されます。

  • Description: 「Unclosed character class(閉じられていない文字クラス)」というエラーの説明。
  • Index: エラーが発生した位置(この場合は 0)。
  • Message: エラーの説明、インデックス、問題のあるパターン、エラー箇所を示す ^ マークを含む詳細メッセージ。
  • Pattern: エラーの原因となった正規表現パターン [

このように PatternSyntaxException を適切にキャッチして処理することで、プログラムが異常終了するのを防ぎ、ユーザーにとって分かりやすいエラーメッセージを提供できます。特に、ユーザー入力や外部ファイルから正規表現を受け取るアプリケーションでは、必ず try-catch 構文による例外処理を実装することをおすすめします。

  1. 【Java】正規表現のメタ文字\B(非単語境界)の使い方をサンプルコードで解説

    Javaの正規表現におけるメタ文字「\B」は、単語境界以外の位置(非単語境界)にマッチします。この記事では、\Bの基本的な意味と、サンプルコードによる具体的な動作をわかりやすく解説します。 メタ文字\Bとは 正規表現の\bは「単語境界」、すなわち単語文字([a-zA-Z_0-9])とそれ以外の文字の境目にある位置にマッチします。\Bはその逆で、次のような単語境界になっていない位置にマッチします。 単語文字と単語文字の間(例:「ab」の「a」と「b」の間) 非単語文字と非単語文字の間(例:「!@」の「!」と「@」の間) また、\Bはゼロ幅アサーションと呼ばれる種類のパターンのため、マッチし

  2. Javaの正規表現で文字列から数値を抽出する方法

    Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp