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 相关文章推荐
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JAVASCRIPT  THIS详解 面向对象
Mar 25 Javascript
javascript 模拟点击广告
Jan 02 Javascript
jquery $.getJSON()跨域请求
Dec 21 Javascript
jQuery+ajax中getJSON() 用法实例
Dec 22 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
Jun 26 Javascript
js实现百度登录框鼠标拖拽效果
Mar 07 Javascript
AngularJS实现页面定时刷新
Mar 14 Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 Javascript
详解json串反转义(消除反斜杠)
Aug 12 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 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(6) 面向对象
2010/02/16 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP重载基础知识回顾
2020/09/10 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
教师绩效工资方案
2014/02/01 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
文秘个人求职信范文
2014/04/22 职场文书
千手观音观后感
2015/06/03 职场文书