# PatternSyntaxException 类的方法

PatternSyntaxException 是未经检查的异常,指示正则表达式模式中的语法错误。PatternSyntaxException 类提供了以下方法来帮助你确定是什么出了问题:

  • public String getDescription():检索错误的描述。
  • public int getIndex():检索错误索引。
  • public String getPattern():检索错误的正则表达式模式。
  • public String getMessage():返回一个多行字符串,其中包含语法错误及其索引的描述,错误的正则表达式模式以及模式中错误索引的可视指示。

检查异常,更新之前的测试工具类,这里就更新之前一直使用的函数就行了

 public static void regexTest(String regex, String input) {
    System.out.println("===  " + regex);
    Pattern pattern = null;
    Matcher matcher = null;
    try {
        pattern = Pattern.compile(regex);
        matcher = pattern.matcher(input);
    } catch (PatternSyntaxException pse) {
        System.out.format("有一个问题,正则表达式: %n");
        System.out.format("模式是: %s%n",
                          pse.getPattern());
        System.out.format("描述是: %s%n",
                          pse.getDescription());
        System.out.format("消息是: %s%n",
                          pse.getMessage());
        System.out.format("索引为: %s%n",
                          pse.getIndex());
        System.exit(0);
    }
    boolean found = false;
    while (matcher.find()) {
        // 索引 包含头 不包含尾
        System.out.format("我发现文本中的" +
                                  " \"%s\" " +
                                  "在开始索引 %d 和 结束索引 %d.%n",
                          matcher.group(),
                          matcher.start(),
                          matcher.end());
        found = true;
    }
    if (!found) {
        System.out.format("No match found.%n");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

下面来测试下:

---- Test code ----
regexTest("?i)foo", "FOOfooFoOfoO");

---- Output ----
===  ?i)foo
有一个问题,正则表达式:
模式是: ?i)foo
描述是: Dangling meta character '?'
消息是: Dangling meta character '?' near index 0
?i)foo
^
索引为: 0

1
2
3
4
5
6
7
8
9
10
11
12
13

从这个输出,我们可以看到,语法错误是索引 0 上的悬挂元字符(问号)。缺少的开头圆括号是罪魁祸首。