定义:贪婪匹配会尽可能多地匹配字符。默认情况下,大多数正则表达式量词都是贪婪的。
常见的贪婪量词:
*:匹配前一个字符零次或多次+:匹配前一个字符一次或多次?:匹配前一个字符零次或一次{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>