$str="aa1122ccbb";
$str =~ /a\w+?c/
这是个非贪婪模式,
根据非贪婪匹配:(lazy match,reluctant)尽可能少地匹配,也叫做懒惰匹配
那么上面就应该匹配\w+至少一次,那么上面就应该匹配aac,匹配不上才对,这个非贪婪模式匹配流程是什么
匹配流程分析
起始位置
引擎从字符串起始位置开始:
text
a a 1 1 2 2 c c b b
↑
匹配 a
第一个 a 匹配位置0的 'a':
text
[a] a 1 1 2 2 c c b b
非贪婪 \w+? 启动
\w+? 是非贪婪量词,先尝试最小匹配(1个字符)
匹配位置1的 'a'(\w包含字母)
当前匹配:"aa"
text
[a a] 1 1 2 2 c c b b
尝试匹配后续 c
下一个字符是 '1'(位置2),不是 'c'
❌ 匹配失败
\w+? 扩展匹配
由于后续 c 匹配失败,非贪婪量词被迫扩展匹配:
匹配下一个字符 '1' → "aa1"
尝试匹配 c → 下一个是 '1'(位置3),失败
继续扩展:匹配 '1' → "aa11" → 下一个是 '2',失败
继续扩展:匹配 '2' → "aa112" → 下一个是 '2',失败
继续扩展:匹配 '2' → "aa1122" → 下一个是 'c'(位置6)
成功匹配 c
当前匹配:"aa1122"
下一个字符 'c' 匹配成功
最终匹配:"aa1122c"
text
[a a 1 1 2 2 c] c b b