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. 常见错误包括:
    • 缺少括号
    • 错误的转义字符
    • 悬空的元字符(如 ?*+
相关推荐
程序员老陆16 小时前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
2601_9638699517 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
水獭比特17 小时前
localhost 不是安全边界:给 Agent Web 入口补上四层门禁
人工智能·python
Generalzy17 小时前
Whisper + VAD + TTS:一套完整的 Python 本地语音处理流水线
python·whisper·语音识别
qpsj17 小时前
让 LLM 控制 AutoCAD/ZWCAD:COM 自动化 + MCP 封装
python·llm
赟爸17 小时前
直播切片素材杂乱不好复用,易元AI要怎么处理
大数据·人工智能·python
名字还没想好☜17 小时前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
怪奇云呼军18 小时前
从声音特征到 CRM 回流:闪电智能 Voice Agent 沟通策略自适应系统 v1 实战
android·人工智能·python·音视频·语音识别
jufeng130718 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 6 篇】
python·ai agent·记忆系统
kevinnett18 小时前
别再把模型地址写死了:用 Python 设计一个可切换的 LLM 调用层
python