当前位置: 首页 > news >正文

Java正则表达式:贪婪、懒惰与独占模式解析

Java正则表达式贪婪与懒惰模式详解

在Java正则表达式中,贪婪(Greedy)、懒惰(Lazy/Reluctant)和独占(Possessive)是三种不同的匹配模式,它们决定了正则表达式引擎如何处理量词匹配。

1. 贪婪模式(Greedy)

特点

  • 默认匹配模式,量词会尽可能多地匹配字符
  • 匹配成功后若导致后续部分无法匹配,会进行回溯
  • 使用量词:*, +, ?, {n}, {n,m}, {n,}

示例

String text = "aabab";
Pattern pattern = Pattern.compile("a.*b"); // 贪婪模式
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {System.out.println(matcher.group()); // 输出"aabab"
}

2. 懒惰模式(Lazy/Reluctant)

特点

  • 也称为非贪婪模式,量词会尽可能少地匹配字符
  • 在量词后添加?开启懒惰模式
  • 使用量词:*?, +?, ??, {n}?, {n,m}?, {n,}?

示例

String text = "aabab";
Pattern pattern = Pattern.compile("a.*?b"); // 懒惰模式
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {System.out.println(matcher.group()); // 输出"aab"和"ab"
}

3. 独占模式(Possessive)

特点

  • 类似贪婪模式但不会回溯
  • 在量词后添加+开启独占模式
  • 使用量词:*+, ++, ?+, {n}+, {n,m}+, {n,}+
  • 匹配失败时不会尝试其他可能性,性能更高但灵活性较低

4. 三种模式对比

特性贪婪模式懒惰模式独占模式
匹配原则尽可能多尽可能少尽可能多不回溯
回溯机制
性能中等中等最高
语法默认量词量词+?量词++

5. 实际应用场景

  1. 贪婪模式适用场景

    • 需要匹配最大可能文本块
    • 如提取HTML标签内容:<div>.*</div>
  2. 懒惰模式适用场景

    • 需要精确匹配最小文本块
    • 如提取带特殊符号的参数:\\$.+?\\$
  3. 独占模式适用场景

    • 性能敏感且确定不会需要回溯的场景
    • 如简单字符串验证

理解这三种模式的差异对于编写高效、准确的正则表达式至关重要。

http://www.xdnf.cn/news/967933.html

相关文章:

  • Tunna工具实战:基于HTTP隧道的RDP端口转发技术
  • java 数据结构-HashMap
  • 睡岗检测算法AI智能分析网关V4全场景智能守护,筑牢安全效率防线
  • golang -- unsafe 包
  • gitlab-runner 如何配置使用 Overwrite generated pod specifications
  • 图注意力卷积神经网络GAT在无线通信网络拓扑推理中的应用
  • 第四章 软件需求工程
  • 上位机开发:C# 读写 PLC 数据块数据
  • CppCon 2015 学习:Racing the File System
  • “详规一张图”——上海土地利用数据
  • 《大模型RAG进阶实战训练营毕业总结》
  • 多模态2025:技术路线“神仙打架”,视频生成冲上云霄
  • 雷卯针对易百纳海鸥派海思SD3403 SS928智能视觉AI视觉国产化4K视频开发板防雷防静电方案
  • 香橙派3B学习笔记9:Linux基础gcc/g++编译__C/C++中动态链接库(.so)的编译与使用
  • Vim 匹配跳转与搜索命令完整学习笔记
  • ArcGIS Pro 3.4 二次开发 - 任务
  • word的目录和正文之间存在一张空白纸,目录后面的分节符为什么调不上去?
  • 《函数之恋》
  • STL 4函数对象
  • 工控类UI设计经常接触到10.1寸迪文屏
  • React【回顾】 深层次面试详解:函数式组件核心原理与高级优化
  • 香港科技大学(广州)机器人与自主系统学域(ROAS)2025年度夏令营招募!
  • 《高等数学》(同济大学·第7版)第三章第六节函数图形的描绘
  • 如何判断Cursor邮箱被封?
  • 【Dv3Admin】系统视图角色菜单API文件解析
  • 钉钉告警集成部署指南
  • DataSource学习
  • 【时时三省】(C语言基础)静态局部变量(static局部变量)
  • Visual Studio2022配置OpenCV环境
  • 自定义表单组件面板排序处理