← eetop.cn_Perl语言入门(第四版小骆驼书)

推荐答案 测试一下

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}?)
  • 贪婪与非贪婪匹配行为差异
  • 回溯在非贪婪匹配中的机制
  • 非贪婪模式的适用场景(避免过度匹配)
  • 非贪婪与占有优先量词的区别
← 上一题
登录后反馈错题
下一题 →