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

JAVA中的贪婪爬取和非贪婪爬取

正则表达式匹配模式对比

贪婪爬取(Greedy Matching)
  • 正则表达式ab+
  • 行为b+ 处于贪婪模式,会尽可能多地匹配 b 字符,直至字符串末尾。
  • 代码示例
import java.util.regex.*;public class GreedyExample {public static void main(String[] args) {String text = "abbbbbbb";Pattern pattern = Pattern.compile("ab+");Matcher matcher = pattern.matcher(text);if (matcher.find()) {System.out.println("贪婪模式匹配结果: " + matcher.group());}}
}

  • 输出
贪婪模式匹配结果: abbbbbbb
  • 解释ab+ 匹配一个 a 后面跟着尽可能多的 b,所以匹配了整个字符串 "abbbbbbb"
非贪婪爬取(Non - Greedy/Lazy Matching)
  • 正则表达式ab+?
  • 行为b+? 是非贪婪模式,会尽可能少地匹配 b 字符,仅匹配最少的一个 b(因为 + 要求至少匹配一个)。
  • 代码示例
import java.util.regex.*;public class NonGreedyExample {public static void main(String[] args) {String text = "abbbbbbb";Pattern pattern = Pattern.compile("ab+?");Matcher matcher = pattern.matcher(text);if (matcher.find()) {System.out.println("非贪婪模式匹配结果: " + matcher.group());}}
}
  • 输出
非贪婪模式匹配结果: ab
  • 解释ab+? 匹配一个 a 后面跟着最少的 b 字符。由于 + 要求至少一个 b,所以只匹配了 "ab"
贪婪与非贪婪模式对比
模式正则表达式匹配结果(字符串 "abbbbbbb")说明
贪婪模式ab+abbbbbbb匹配 a 后所有 b,直到末尾
非贪婪模式ab+?ab匹配 a 后最少的一个 b
扩展示例:多个匹配
  • 贪婪模式(ab+
import java.util.regex.*;public class GreedyMultiExample {public static void main(String[] args) {String text = "abbbbbbb abbb";Pattern pattern = Pattern.compile("ab+");Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("贪婪模式: " + matcher.group());}}
}
  • 输出
贪婪模式: abbbbbbb
贪婪模式: abbb
  • 解释:每次匹配时,ab+ 都会尽量匹配最多的 b

  • 非贪婪模式(ab+?

import java.util.regex.*;public class NonGreedyMultiExample {public static void main(String[] args) {String text = "abbbbbbb abbb";Pattern pattern = Pattern.compile("ab+?");Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("非贪婪模式: " + matcher.group());}}
}
  • 输出
非贪婪模式: ab
非贪婪模式: ab
  • 解释:每次匹配时,ab+? 只匹配一个 a 和最少的一个 b
总结
  • 贪婪模式(如 ab+:尽可能匹配最多的 b,适合需要捕获最大范围的场景。
  • 非贪婪模式(如 ab+?:尽可能匹配最少的 b,适合需要精确匹配最小单元的场景。在 "abbbbbbb" 示例中,贪婪模式匹配整个字符串,非贪婪模式只匹配 "ab"
http://www.xdnf.cn/news/2536.html

相关文章:

  • C++:STL——list
  • PG-EXPLAIN基础
  • 稳扎稳打,25西电生命科学技术学院(考研录取情况)
  • HTML 的基本结构与简单文件编写方法
  • 【MobaXterm】win10下载v25.1安装流程
  • Java——封装(面向对象)
  • AI算力革命驱动光模块产业跃迁:800G规模化部署与1.6T技术竞速下的市场新纪元
  • RAGFlow解决Docker Compose include 报错问题
  • Android13增加一个systemservice,并允许APP访问
  • 开源财务软件:企业财务数字化转型的有力工具
  • 图片矫正模型
  • FPGA时钟设计
  • JavaScript之Webpack的模块加载机制
  • 【Linux网络与网络编程】13.五种 IO 模型
  • AIGC(生成式AI)试用 32 -- AI做软件程序测试 3
  • git提交规范记录,常见的提交类型及模板、示例
  • 【音视频】SDL简介
  • 算法题(135):唯一的雪花
  • 大数据系列 | 日志数据采集工具Logstash的架构分析及应用
  • 微信小程序导航栏
  • C++STL(九) :bitset的介绍与使用
  • MCP介绍与使用
  • 第二部分:网页的妆容 —— CSS(上)
  • OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理
  • 神经网络预测评估机制:损失函数详解
  • adb devices 报权限错误
  • 文件缓冲区(IO与文件 ·III)(linux/C)
  • 使用 malloc 函数模拟开辟一个 3x5 的整型二维数组
  • 基于QT(C++)实现(GUI)旅行查询与模拟系统
  • Python3 (13)循环语句