【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标签或其他需要精确控制匹配长度的文本时非常有用。

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

相关推荐
mask哥8 分钟前
详解最新链路追踪skywalking框架介绍、架构、环境本地部署&配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等
java·spring cloud·架构·gateway·springboot·skywalking·链路追踪
XU磊26011 分钟前
javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
java·idea
学也不会14 分钟前
雪花算法
java·数据库·oracle
qq_5432485220 分钟前
正则表达式三剑客之——awk命令
正则表达式
晓华-warm23 分钟前
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
java·中间件·流程图·开源软件·flowable·工作流·activities
凭君语未可26 分钟前
介绍 IntelliJ IDEA 快捷键操作
java·ide·intellij-idea
qq_5432485226 分钟前
正则表达式三剑客之——grep和sed
linux·运维·正则表达式
码上飞扬42 分钟前
Java大师成长计划之第5天:Java中的集合框架
java·开发语言
24k小善44 分钟前
FlinkUpsertKafka深度解析
java·大数据·flink·云计算
EnigmaCoder1 小时前
java面向对象编程【高级篇】之多态
java·开发语言