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

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

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi2 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号2 天前
java函数式编程--入门基础
java·编程·函数式编程