Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
PatternSyntaxException
是非检查型异常,表示正则表达式模式中的语法错误。PatternSyntaxException
类提供以下方法来帮助你确定出错的地方:
public String getDescription()
:获取错误的描述。public int getIndex()
:获取错误索引。public String getPattern()
:获取错误的正则表达式模式。public String getMessage()
:返回一个多行字符串,其中包含语法错误及其索引的描述,错误的正则表达式模式以及模式中的错误索引。以下源代码 RegexTestHarness2.java
更新我们的测试工具以检查格式错误的正则表达式:
import java.io.Console; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.regex.PatternSyntaxException; public class RegexTestHarness2 { public static void main(String[] args){ Pattern pattern = null; Matcher matcher = null; Console console = System.console(); if (console == null) { System.err.println("No console."); System.exit(1); } while (true) { try{ pattern = Pattern.compile(console.readLine("%nEnter your regex: ")); matcher = pattern.matcher(console.readLine("Enter input string to search: ")); } catch(PatternSyntaxException pse){ console.format("There is a problem" + " with the regular expression!%n"); console.format("The pattern in question is: %s%n", pse.getPattern()); console.format("The description is: %s%n", pse.getDescription()); console.format("The message is: %s%n", pse.getMessage()); console.format("The index is: %s%n", pse.getIndex()); System.exit(0); } boolean found = false; while (matcher.find()) { console.format("I found the text" + " \"%s\" starting at " + "index %d and ending at index %d.%n", matcher.group(), matcher.start(), matcher.end()); found = true; } if(!found){ console.format("No match found.%n"); } } } }
要运行此测试,请输入 ?i)foo
作为正则表达式。这个错误是程序员忘记嵌入式标志表达式 (?i)
中的左括号的常见情况。这样做会产生以下结果:
Enter your regex: ?i) There is a problem with the regular expression! The pattern in question is: ?i) The description is: Dangling meta character '?' The message is: Dangling meta character '?' near index 0 ?i) ^ The index is: 0
从这个输出中,我们可以看到语法错误是索引 0 处的悬空元字符(问号)。缺少左括号是罪魁祸首。