JavaScript正则表达式贪婪与非贪婪模式详解

作者:半夏

时间:2026-10-21

浏览:655

本文深入解析JavaScript中正则表达式的贪婪与非贪婪模式。通过具体代码示例,阐明\w+、*、?等量词在匹配不定次数时的行为差异。贪婪模式尽可能多匹配,非贪婪模式(加?)尽可能少匹配,确保整体表达式成功。文章提供在线测试工具链接,帮助开发者掌握精准匹配技巧。

文章目录

贪婪与非贪婪模式概述

本文通过具体实例,系统总结JavaScript中正则表达式的贪婪模式与非贪婪模式,旨在为读者提供清晰的参考与学习素材。

首先展示一段相关的JavaScript代码示例。


<script>
try{
 str="<p>abcdefg</p><p>abcdefghijkl</p>";
 re1=str.match(/<p>[\W\w]+?<\/p>/ig);
 alert("非贪婪模式:\r\n\r\n1:"+re1[0]+"\r\n2:"+re1[1]);
 re1=str.match(/<p>[\W\w]+<\/p>/ig);
 alert("贪婪模式:\r\n\r\n"+re1);
 re1=str.match(/<p>(.+?)<\/p>/i);
 alert("非贪婪模式,且不要标记:\r\n\r\n1:"+re1[1]);
 re1=str.match(/<p>(.+)<\/p>/i);
 alert("贪婪模式,且不要标记:\r\n\r\n"+re1[1]);
}catch(e){
 alert(e.description)
}
</script>

随后提供若干具体匹配案例进行说明。

贪婪模式的匹配机制

贪婪模式的行为机制。

当使用表示匹配次数的特殊符号(如"{m,n}"、"{m,}"、"?"、"*"、"+")时,同一表达式可根据被匹配字符串的不同产生不同次数的匹配。在匹配过程中,这类重复匹配不定次数的表达式会尽可能多地尝试匹配。以文本 "dxxxdxxxd" 为例,具体表现如下。

贪婪模式的具体表现。

表达式 匹配结果
(d)(\w+) "\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"
(d)(\w+)(d) "\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。
虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,
"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"
 

由此可见,"\w+" 在匹配时,总是尽可能多地选取符合规则的字符。在第二个示例中,尽管它未匹配最后一个 "d",这是为了确保整个表达式能够成功匹配。同理,包含 "*" 和 "{m,n}" 的表达式均遵循尽可能多匹配的原则;而带 "?" 的表达式在可选匹配的情况下,也倾向于进行匹配。这种匹配策略被称为“贪婪”模式。

非贪婪模式的行为解析

非贪婪模式的定义与行为。

若在表示匹配次数的特殊符号后追加一个 "?" 号,则使匹配次数不定的表达式尽可能少地匹配,即让可选匹配的表达式尽可能“不匹配”。这种策略称为“非贪婪”模式,亦称“勉强”模式。当少匹配会导致整个表达式匹配失败时,非贪婪模式会像贪婪模式一样,最小限度地额外匹配一些字符,以确保整体表达式成功。以文本 "dxxxdxxxd" 为例,具体表现如下。

表达式 匹配结果
(d)(\w+?) "\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,
结果是:"\w+?" 只匹配了一个 "x"
(d)(\w+?)(d) 为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,
从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

HTML标签匹配实例分析

更多复杂场景下的匹配示例。

示例1:当表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 进行匹配时,匹配成功,但匹配到的内容是整个字符串 "<td><p>aa</p></td> <td><p>bb</p></td>"。此时,表达式中的 "</td>" 将与字符串中最后一个 "</td>" 进行匹配。

举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。

正则工具与扩展资源

此外,推荐两款便捷的正则表达式在线工具供读者使用。

JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

如需了解更多JavaScript相关内容,建议查阅本站专题:《JavaScript正则表达式技巧大全》、《JavaScript替换操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript中json操作技巧总结》、《JavaScript错误与调试技巧总结》及《JavaScript数学运算用法总结》。

希望本文的阐述对读者的JavaScript程序设计工作有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章