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

文章目录

  • [453. Java 正则表达式 - 异常处理:`PatternSyntaxException`](#453. Java 正则表达式 - 异常处理:PatternSyntaxException)
    • [1️⃣ 什么是 `PatternSyntaxException`](#1️⃣ 什么是 PatternSyntaxException)
    • [2️⃣ 关键方法](#2️⃣ 关键方法)
    • [3️⃣ 示例:捕获正则表达式语法错误](#3️⃣ 示例:捕获正则表达式语法错误)
    • [4️⃣ 常见错误示例](#4️⃣ 常见错误示例)
    • [5️⃣ 小结](#5️⃣ 小结)

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

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


1️⃣ 什么是 PatternSyntaxException

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

2️⃣ 关键方法

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

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


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

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;

        // 使用 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️⃣ 常见错误示例

假设用户输入了:

java 复制代码
Enter your regex: ?i)

输出结果:

java 复制代码
⚠ 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. 常见错误包括:
    • 缺少括号
    • 错误的转义字符
    • 悬空的元字符(如 ?、*、+)
相关推荐
1024奇点13 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣13 小时前
Django
后端·python·django
Warren2Lynch14 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
如若12314 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
Knight_AL14 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0315 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by2099916 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河16 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新16 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
IT召唤狮16 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php