ENGINEERING PLAYBOOK

正则贪婪、懒惰与回溯

贪婪量词会先尝试较长范围,懒惰量词先尝试较短范围,但两者都受后续模式与回溯影响。应从输入边界和期望结果判断,而不是只机械添加问号。

适用人群:需要用正反样本验证贪婪、懒惰和回溯边界的前端与脚本开发人员

排查路径

  1. 使用短字符串可视化每一步匹配范围。
  2. 比较贪婪与懒惰量词的返回结果。
  3. 观察后续字符如何触发回溯。
  4. 用更明确的字符类减少无界通配。

执行步骤

  1. 固定输入后分别运行两种模式。
  2. 检查全局匹配是否产生多个结果。
  3. 避免对超长用户输入使用嵌套量词。
  4. 可用解析器表达结构时不要强行使用单个正则。
  5. 记录正则引擎和运行时版本。

可复制命令与示例

比较匹配范围

'<b>one</b><b>two</b>'.match(/<b>.*<\/b>/g);

懒惰量词示例

'<b>one</b><b>two</b>'.match(/<b>.*?<\/b>/g);

可复现任务记录

具体错误或任务

表达式 <.*> 对两个标签只返回一个跨段匹配,需要比较懒惰量词与结构化解析。

失败信号:输入 <a>one</a><a>two</a> 时得到单个从首个 < 到最后一个 > 的匹配。

最小输入

正样本、反样本、目标 JavaScript 运行时与表达式 /<.*?>/g。

验证命令或步骤

node -e "console.log('<a>one</a><a>two</a>'.match(/<.*?>/g))"

预期输出

输出四个独立标签标记;若目标是解析 HTML,则应退出正则方案改用解析器。

失败输出

使用 /<.*>/g 时只得到一个跨越两段内容的长匹配。

成功判据

至少三个正样本和三个反样本通过,并记录输入长度与运行时边界。

本任务常见错误

  • 只用一个成功样本
  • 把懒惰量词当成结构化解析器
  • 忽略大输入下的回溯成本

资料与适用边界

语法和标志依据 MDN JavaScript 正则文档;复杂标记语言应使用相应解析器而非扩大正则。

证据块复核日期:2026-09-04

相关站内页面

资料依据与复核边界

资料复核日期:2026-08-29