JS正则表达式学习之贪婪和非贪婪模式实例总结


Posted in Javascript onDecember 26, 2016

本文实例总结了JS正则表达式贪婪和非贪婪模式。分享给大家供大家参考,具体如下:

首先上一段js代码:

<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"

更多的情况,举例如下:

举例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 相关文章推荐
JavaScript 解析读取XML文档 实例代码
Jul 07 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
Jan 15 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
May 22 Javascript
Javascript中数组sort和reverse用法分析
Dec 30 Javascript
JavaScript通过代码调用Flash显示的方法
Feb 02 Javascript
jQuery实现的表格展开伸缩效果实例
Sep 07 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
在Vue 中使用Typescript的示例代码
Sep 10 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
element-ui如何防止重复提交的方法步骤
Dec 09 Javascript
js实现幻灯片轮播图
Aug 14 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 #Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 #Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 #Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 #Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
Dec 26 #Javascript
Bootstrap的modal拖动效果
Dec 25 #Javascript
原生ajax处理json格式数据的实例代码
Dec 25 #Javascript
You might like
一个高ai的分页函数和一个url函数
2006/10/09 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
php简单中奖算法(实例)
2017/08/15 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
[IE&amp;FireFox兼容]JS对select操作
2007/01/07 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python实现redis三种cas事务操作
2017/12/19 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
如何写好自荐信
2014/04/07 职场文书
思想品德评语大全
2014/12/31 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫