定义:贪婪匹配会尽可能多地匹配字符。默认情况下,大多数正则表达式量词都是贪婪的。
常见的贪婪量词:
*
:匹配前一个字符零次或多次+
:匹配前一个字符一次或多次?
:匹配前一个字符零次或一次{n,}
:匹配前一个字符至少 n
次{n,m}
:匹配前一个字符至少 n
次,至多 m
次示例:
a.*b
匹配字符串 "a"
和 "b"
之间的所有字符,包括 "a"
和 "b"
自身。
匹配文本:
a123b456b
结果:a123b456b
定义:懒惰匹配会尽可能少地匹配字符,直到找到满足条件的最小匹配。懒惰匹配在贪婪量词后加 ?
实现。
常见的懒惰量词:
*?
:匹配前一个字符零次或多次,但尽可能少匹配+?
:匹配前一个字符一次或多次,但尽可能少匹配??
:匹配前一个字符零次或一次,但尽可能少匹配{n,}?
:匹配前一个字符至少 n
次,但尽可能少匹配{n,m}?
:匹配前一个字符至少 n
次,至多 m
次,但尽可能少匹配示例:
a.*?b
匹配字符串 "a"
和 "b"
之间的最少字符,包括 "a"
和 "b"
自身。
匹配文本:
a123b456b
结果:a123b
和 456b
考虑以下文本和两个正则表达式:
abc123def456ghi
a.*f
匹配结果:abc123def456f
a.*?f
匹配结果:abc123f
贪婪匹配适用于需要匹配最大范围的场景,如查找从某个起点到终点的最长匹配。
示例:匹配整个 HTML 标签
<a.*>.*</a>
懒惰匹配适用于需要匹配最小范围的场景,如查找最小的嵌套结构。
示例:匹配每个独立的 HTML 标签
<a.*?>.*?</a>
在实际使用中,选择贪婪或懒惰匹配取决于具体需求。以下是一些考虑因素:
<p>.*</p>
匹配:
<p>first paragraph</p> <p>second paragraph</p>
结果:<p>first paragraph</p> <p>second paragraph</p>
<p>.*?</p>
匹配:
<p>first paragraph</p> <p>second paragraph</p>
结果:<p>first paragraph</p>
和 <p>second paragraph</p>