跳转到主要内容
模块 2 · 第 3 课(共 4)课程中的7/32~10 min
模块课程(3/4)

贪婪与懒惰

默认情况下,量词是贪婪的:它们消耗尽可能多的 同时保持模式有效。在量词后面添加 ? (*?, +?, ??, {n,m}?) 为您提供惰性版本:它消耗少至 可能。

Code
Sample: <b>uno</b> e <i>due</i>

Greedy pattern  <.*>     matches:  <b>uno</b> e <i>due</i>   (everything)
Lazy pattern    <.*?>    matches:  <b>           </b>
                                   <i>           </i>        (4 matches with the g flag)

完全相同的模式,一个不同的字符(? 添加到 量词),结果完全不同。

当重要的时候

  • 提取分隔符之间的内容(HTML 标签、引号、 括号)惰性版本几乎总是正确的。
  • 要匹配直到行尾,您通常需要贪婪(.*)。

引擎中的贪婪策略与懒惰策略

贪婪量词会消耗尽可能多的文本,并且仅在被迫时才回溯。通过添加 ? (lazy),引擎消耗绝对最小值并一次前进一个字符来搜索模式的下一个匹配项。

尝试一下

锻炼#regex.m2.l3.e1
尝试:0加载中...

使用惰性版本“.*?”从示例中提取每个 HTML 标记(例如“<b>”、“</b>”、“<i>”、“</i>”)。

正在加载编辑器...
显示提示

贪婪 <.*> 匹配从第一个标签的开头到最后一个标签的结尾。 Lazy <.*?> 在遇到的第一个 > 处停止。

3 次尝试后可用的解决方案

复习练习

锻炼#regex.m2.l3.e2
尝试:0加载中...

提取文本中双引号之间的每个字符串(例如“ciao”、“mondo”)。使用量词的惰性版本以避免跳转到稍后的结束语。

正在加载编辑器...
显示提示

“.*?”在第一个结束双引号处停止。

3 次尝试后可用的解决方案

额外的挑战

锻炼#regex.m2.l3.e3
尝试:0加载中...

Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.

正在加载编辑器...
显示提示

使用 \\[ 作为左括号,然后使用 .*?最后 \\] 表示闭括号。

3 次尝试后可用的解决方案