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

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

相关推荐
曹牧1 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7252 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎2 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄2 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿2 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds3 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹3 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚3 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace3 小时前
计算机专业基础教材
java·开发语言