The JavaTM Tutorial

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Trail: Bonus
Lesson: Regular Expressions

## Methods of the PatternSyntaxException Class

> A `PatternSyntaxException` is an unchecked exception that indicates a syntax error in a regular expression pattern. The `PatternSyntaxException` class provides the following methods to help you determine what went wrong:
> - `public String getDescription()`: Retrieves the description of the error.
> - `public int getIndex()`: Retrieves the error index.
> - `public String getPattern()`: Retrieves the erroneous regular-expression pattern.
> - `public String getMessage()`: Returns a multi-line string containing the description of the syntax error and its index, the erroneous regular-expression pattern, and a visual indication of the error index within the pattern.
> The following source code, `RegexTestHarness2`, updates our test harness to check for malformed regular expressions. It intentionally introduces a syntax error, then examines the caught exception using the methods listed above. Changes are marked in bold.

> >     import java.io.*;
> >     import java.util.regex.*;

> >     public final class RegexTestHarness2 {

> >         private static String REGEX;
> >         private static String INPUT;
> >         private static BufferedReader br;
> >         private static Pattern pattern;
> >         private static Matcher matcher;
> >         private static boolean found;

> >         public static void main(String[] argv) {
> >             initResources();
> >             processTest();
> >             closeResources();
> >         }

> >         private static void initResources() {
> >            try {
> >                br = new BufferedReader(new FileReader("regex.txt"));
> >            }
> >            catch (FileNotFoundException fnfe) {
> >                 System.out.println("Cannot locate input file! "+fnfe.getMessage());
> >                 System.exit(0);
> >             }
> >            try {
> >                REGEX = br.readLine();
> >                INPUT = br.readLine();
> >            } catch (IOException ioe) {}

> >            try {
> >             pattern = Pattern.compile(REGEX);
> >             matcher = pattern.matcher(INPUT);
> >            }
> >            catch(PatternSyntaxException pse) {
> >                System.out.println("There is a problem with the regular expression!");
> >                System.out.println("The pattern in question is: "+pse.getPattern());
> >                System.out.println("The description is: "+pse.getDescription());
> >                System.out.println("The message is: "+pse.getMessage());
> >                System.out.println("The index is: "+pse.getIndex());
> >                System.exit(0);
> >             }

> >             System.out.println("Current REGEX is: "+REGEX);
> >             System.out.println("Current INPUT is: "+INPUT);
> >         }

> >         private static void processTest() {
> >             while(matcher.find()) {
> >                 System.out.println("I found the text \"" + matcher.group() +
> >                                    "\" starting at index " + matcher.start() +
> >                                    " and ending at index " + matcher.end() + ".");
> >                 found = true;
> >             }

> >             if(!found){
> >                 System.out.println("No match found.");
> >             }
> >         }

> >         private static void closeResources() {
> >            try{
> >                br.close();
> >            }catch(IOException ioe){}
> >         }
> >     }

> To run this test, change the file `regex.txt` to contain `?i)foo` as its first line, and `FoO` as its second line. This mistake is a common scenario in which the programmer has forgotten the opening parenthesis in the embedded flag expression `(?i)`.

> >     OUTPUT:

> >     There is a problem with the regular expression!
> >     The pattern in question is: ?i)foo
> >     The description is: Dangling meta character '?'
> >     The message is: Dangling meta character '?' near index 0
> >     ?i)foo
> >     ^
> >     The index is: 0

> From this output, we can see that the syntax error is a dangling metacharacter (the question mark) at index 0. A missing opening parenthesis is the culprit.

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Copyright 1995-2004 Sun Microsystems, Inc. All rights reserved.