453. Java 正则表达式 - 异常处理:PatternSyntaxException

453. Java 正则表达式 - 异常处理:PatternSyntaxException

在使用正则表达式时,语法错误是常见问题。Java 提供了 PatternSyntaxException 来帮助我们定位问题。


1️⃣ 什么是 PatternSyntaxException

  • 类型:unchecked exception(非受检异常)
  • 作用:当正则表达式语法错误时抛出
  • 用途:帮助开发者快速定位正则表达式错误位置和原因

2️⃣ 关键方法

方法 功能
getDescription() 返回错误描述信息,例如 “Dangling meta character '?'”
getIndex() 返回错误发生的位置(索引)
getPattern() 返回出错的正则表达式
getMessage() 返回多行字符串,包含错误描述、索引和模式的可视化指示

💡 提示:结合这些方法可以精确定位问题,非常适合调试复杂正则表达式。


3️⃣ 示例:捕获正则表达式语法错误

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;

        // 使用 Scanner 替代 Console,兼容 IDE
        Scanner scanner = new Scanner(System.in);

        while (true) {
            try {
                System.out.print("Enter your regex: ");
                pattern = Pattern.compile(scanner.nextLine());

                System.out.print("Enter input string to search: ");
                matcher = pattern.matcher(scanner.nextLine());
            } catch (PatternSyntaxException pse) {
                System.out.println("⚠ There is a problem with the regular expression!");
                System.out.println("Pattern: " + pse.getPattern());
                System.out.println("Description: " + pse.getDescription());
                System.out.println("Message: " + pse.getMessage());
                System.out.println("Error index: " + pse.getIndex());
                continue; // 继续循环,让用户重新输入
            }

            boolean found = false;
            while (matcher.find()) {
                System.out.printf("Found \"%s\" at index %d to %d%n",
                        matcher.group(), matcher.start(), matcher.end());
                found = true;
            }
            if (!found) {
                System.out.println("No match found.");
            }
        }
    }
}

4️⃣ 常见错误示例

假设用户输入了:

Enter your regex: ?i)

输出结果:

⚠ There is a problem with the regular expression!
Pattern: ?i)
Description: Dangling meta character '?'
Message: Dangling meta character '?' near index 0
?i)
^
Error index: 0

💡 分析

  • 错误原因:嵌入式标志缺少左括号 (i)
  • getIndex() → 0,说明问题出在正则的第 0 个字符
  • getDescription() → 提示是 Dangling meta character '?'
  • getMessage() → 提供可视化错误位置,非常直观

5️⃣ 小结

  1. PatternSyntaxException 非受检异常,用于捕获正则语法错误
  2. getDescription(), getIndex(), getPattern(), getMessage() 是定位错误的核心方法
  3. 捕获异常后,可以在控制台输出详细信息,帮助快速调试
  4. 常见错误包括:
    • 缺少括号
    • 错误的转义字符
    • 悬空的元字符(如 ?*+
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容