La création de modèle d'expression régulière peut provoquer la levée d'une exception PatternSyntaxException.

Cette exception se produit si l'expression régulière passée en argument à la méthode compile() de la classe Pattern, comporte des erreurs de syntaxe.

try {
    //Produit une exception car une parenthèse ouvrante 
    //est présente sans la parenthèse fermante
    Pattern modele = Pattern.compile("\\b(A\\w+\\b");
}
catch(PatternSyntaxException e){
    System.out.println(e.getMessage());
}

Un message clair avec une description de l'erreur de syntaxe et un indicateur visuel stuant où elle se situe peut être obtenu en appelant la méthode getMessage().

Unclosed group near index 12
\\b(A\\w+\\b
            ^

Par ailleurs, la classe PatternSyntaxException propose également des méthodes pour récupérer une description (getDescription()), la position de l'erreur (getIndex()) et l'expression régulière erronée (getPattern()).

Description : Unclosed group near index 12
Modèle      : \\b(A\\w+\\b
Position    : 12
Constructeur
Description
PatternSyntaxException(String desc, String regex, int index)
crée une nouvelle instance de la classe PatternSyntaxException en l'initialisant avec une description de l'erreur, l'expression régulière erronée et la position où se situe le début de l'erreur.
Méthode
Description
String getDescription()
retourne la description de l'erreur.
int getIndex()
retourne la position de l'erreur au sein de la chaîne de caractères cible.
String getMessage()
retourne un message complet décrivant l'erreur contenant une description de l'erreur de syntaxe, un indicateur visuel de l'erreur et la position de cette dernière.
String getPattern()
retourne le modèle d'expression régulière erroné.
Exemple [voir]
private void rechercher() {
    try {
        if(this.fen.getTxtSource() != null 
        && !this.fen.getTxtSource().equals(Utilitaires.VIDE)
        && this.fen.getExpression() != null 
        && !this.fen.getExpression().equals(Utilitaires.VIDE)) {
            Pattern modele = Pattern.compile(this.fen.getExpression(), 
                     this.calculerOptions());
            Matcher recherche = modele.matcher(this.fen.getTxtSource());
            int compteur = 0;
            this.fen.initTable();
            this.fen.supprimerSelection();
            while(recherche.find()) {
                compteur++;
                int nombre = recherche.groupCount();
                if(nombre > 0) {
                    for (int i = 0; i < nombre; i++) {
                        int debut = recherche.start(i);
                        int fin = recherche.end(i);
                        String chaine = recherche.group(i);
                        this.afficher(
                                    compteur,
                                    i + 1,
                                    recherche.start(i), 
                                    recherche.end(i), 
                                    recherche.group(i));
                    }
                }
                else {
                    int debut = recherche.start();
                    int fin = recherche.end();
                    String chaine = recherche.group();
                    this.afficher(
                                compteur,
                                0,
                                recherche.start(), 
                                recherche.end(), 
                                recherche.group());
                }
            }
            this.fen.setLblTrouves(this.afficherTrouves(compteur));
            this.fen.ajouterSelection();
        }
    }
    catch(PatternSyntaxException e) {
        this.afficher(e);
    }
}
private void afficher(PatternSyntaxException e) {
    JOptionPane.showMessageDialog(
                this.fen, 
                e.getMessage(), 
                "Erreur : " + e.getPattern(), 
                JOptionPane.WARNING_MESSAGE);
}