【JAVA】正则表达式的贪婪模式与非贪婪模式

在Java中,正则表达式可以使用两种不同的量词模式来匹配字符序列:贪婪模式(greedy)和非贪婪模式(reluctant或lazy)。

贪婪模式 (Greedy)

默认情况下,正则表达式的量词是贪婪的。这意味着当一个量词可以匹配多个字符时,它会尽可能多地匹配。例如:

  • * 匹配前面的元素零次或多次。
  • + 匹配前面的元素一次或多次。
  • ? 匹配前面的元素零次或一次。
  • {n,m} 匹配前面的元素至少n次,至多m次。

这些量词在没有其他限制的情况下,总是尝试匹配尽可能长的字符串。

示例

假设我们有一个字符串 "abcabcabc" 和正则表达式 a.*c,这里的 .* 是贪婪的,它会匹配从第一个 a 到最后一个 c 之间的所有字符,即整个字符串 "abcabcabc"

非贪婪模式 (Reluctant or Lazy)

非贪婪模式则是与贪婪模式相反的行为。当使用非贪婪量词时,它们会尽可能少地匹配字符。为了使量词变为非贪婪模式,可以在量词后面加上一个问号 ?

  • *? 匹配前面的元素零次或多次,但尽可能少。
  • +? 匹配前面的元素一次或多次,但尽可能少。
  • ?? 匹配前面的元素零次或一次,但尽可能少。
  • {n,m}? 匹配前面的元素至少n次,至多m次,但尽可能少。
示例

如果使用相同的字符串 "abcabcabc" 但是正则表达式改为 a.*?c,这里的 .*? 是非贪婪的,它会匹配从第一个 a 开始到最近的一个 c 之间的所有字符,即第一次匹配结果为 "abc",然后继续匹配下一段,直到所有的 "abc" 组合都被找到。

使用场景

  • 贪婪模式 常用于需要获取最长可能匹配的情况。
  • 非贪婪模式 常用于需要获取最短可能匹配的情况,特别是在处理HTML标签或其他需要精确控制匹配长度的文本时非常有用。

在编写正则表达式时,选择正确的模式对于确保你的程序能够正确解析目标文本是非常重要的。

相关推荐
青云交几秒前
Java 大视界 -- Java 大数据实战:分布式架构重构气象预警平台(2 小时→2 分钟)
java·java 大数据 气象预警平台·flink 实时数据清洗·spark 区域定制模型·气象灾害预警系统
柏林以东_1 分钟前
异常的分类与用法
java·开发语言
专注API从业者7 分钟前
淘宝商品 API 接口架构解析:从请求到详情数据返回的完整链路
java·大数据·开发语言·数据库·架构
独自破碎E8 分钟前
解释一下为什么要有虚拟内存
java
哪里不会点哪里.11 分钟前
Spring 的装配顺序详解(配置 → 扫描 → 注入 → 初始化)
java·sql·spring
xiaolyuh12318 分钟前
Spring MVC 深度解析
java·spring·mvc
-凌凌漆-20 分钟前
【java】java中函数加与不加abstract 的区别
java·开发语言
❀͜͡傀儡师22 分钟前
SpringBoot与Artemis整合,实现航空行李追踪消息中枢系统
java·spring boot·后端
青云交23 分钟前
Java 大视界 -- Java 大数据在智能交通高速公路收费系统优化与通行效率提升实战
java
哪里不会点哪里.26 分钟前
IoC(控制反转)详解:Spring 的核心思想
java·spring·rpc