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 相关文章推荐
wordpress之js库集合研究介绍
Aug 17 Javascript
jquery学习笔记二 实现可编辑的表格
Apr 09 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
jQuery弹性滑动导航菜单实现思路及代码
May 02 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
Jul 04 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
js实现文字头像的生成代码
Mar 07 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
FCKeditor添加自定义按钮
2008/03/27 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
采用call方式实现js继承
2014/05/20 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Python实现AI换脸功能
2020/04/10 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
美元符号 $
2022/02/17 杂记