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 相关文章推荐
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
搞定immutable.js详细说明
May 02 Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 Javascript
微信小程序 教程之模块化
Oct 17 Javascript
数组Array的排序sort方法
Feb 17 Javascript
js事件冒泡与事件捕获详解
Feb 20 Javascript
让div运动起来 js实现缓动效果
Jul 06 Javascript
基于 Vue 实现一个酷炫的 menu插件
Nov 14 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 Javascript
JavaScript组合模式---引入案例分析
May 23 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
Yii2单元测试用法示例
2016/11/12 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
Python爬取网页信息的示例
2020/09/24 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
临床医学大学生求职信
2013/09/28 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
小学教师见习总结
2015/06/23 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫
Python实现简单得递归下降Parser
2022/05/02 Python