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处悬空的元字符(问号)。导致开头括号缺失的原因。
