推荐答案
测试一下
题目
5.1非贪婪的数量词 ................................ ................................ ................................ .........…
参考答案与知识点
参考答案
非贪婪数量词(Lazy/Non-greedy Quantifier)是正则表达式中修饰匹配次数的限定符,通过在标准贪婪数量词(*、+、?、{m,n})后添加问号?形成(如*?、+?、??、{m,n}?)。其核心行为是最小化匹配:在满足全局匹配成功的前提下,尽可能少地重复匹配前一字符或子表达式。与默认的贪婪模式(最大化匹配)相反,非贪婪模式从匹配次数下限开始尝试,每次匹配失败才递增一次,直到找到符合条件的匹配或达到上限。
例如字符串"abbbc":
- 贪婪模式 /ab+bc/ 中,b+会贪婪匹配3个b后尝试匹配第二个b失败,导致回溯一次,最终匹配"abbb"(但实际引擎行为因语言而异)
- 非贪婪模式 /ab+?c/ 中,b+?先匹配1个b,正则尝试匹配c失败(下一个字符是b),于是b+?再匹配一个b,重复直到b+?匹配3个b后遇到c成功,匹配"abbbc"。
常见用法:
1. 避免过度匹配:如HTML标签匹配 <.+?> 可获取单个标签,而<.+>会从第一个<匹配到最后一个>。
2. 提取最小重复内容:如字符串"xaxbxcx"中 /a.*?b/ 匹配"axb"而非"axbxc"。
注意事项:
- 非贪婪并非总是更高效:由于需要频繁回溯尝试更少匹配,某些场景下贪婪配合精确字符否定可能更快。
- 必须保证整体匹配成功:若无法匹配,非贪婪会消耗更多回溯次数尝试所有可能性,直至失败。
- 引擎差异:部分语言(如POSIX标准)不支持非贪婪模式,默认仅支持贪婪。
- 与占有优先量词(*+、++等)不同,后者拒绝回溯,可能导致匹配失败或性能差异。
典型面试题:"编写正则提取双引号内的最短内容" 答案:/"[^"]*?"/ 或 /"[^"]*"/ 均可,但 /"[^"]*?"/ 明确体现非贪婪思想。
涉及知识点
- 非贪婪数量词语法(*? +? ?? {n,m}?)
- 贪婪与非贪婪匹配行为差异
- 回溯在非贪婪匹配中的机制
- 非贪婪模式的适用场景(避免过度匹配)
- 非贪婪与占有优先量词的区别