js正则表达式惰性匹配和贪婪匹配用法分析


Posted in Javascript onDecember 26, 2016

本文实例讲述了js正则表达式惰性匹配和贪婪匹配用法。分享给大家供大家参考,具体如下:

在讲贪婪模式和惰性模式之前,先回顾一下JS正则基础:

写法基础:

①不需要双引号,直接用//包含 => /wehfwue123123/.test();

②反斜杠\表示转义 =>/\.jpg$/

③用法基础:.test(str);

语法:

①锚点类

/^a/=>以"a"开头

/\.jpg$/=>以".jpg"结尾

②字符类

[abc]:a或b或c

[0-9]:一个数字

[a-z]:一个字母

.    :任意字符

③元字符

^:在[]里面用表示非,在[]外面用表示开头

\d:[0-9]

\s:空白符

\w:[A-Za-z0-9_]

\D:[^\d]-非数字

\S:非空白符

④量词

{m,n}:m到n次

元字符表示:

*:{0,}

?:{0,1}

+:{1,}

难点:贪婪模式/惰性模式

贪婪模式——在匹配成功的前提下,尽可能多的去匹配

惰性模式——在匹配成功的前提下,尽可能少的去匹配

解释一:码文并茂

使用正则表达式中的贪婪、惰性的量词可以控制表达式匹配过程,我们知道量词?、*、+的意义,可以指定相关模式出现的次数,默认的情况下我们使用的是贪婪量词,它的匹配过程是从整个字符串开始查看,如果不匹配就去掉最后一个,再看看是否匹配,如此循环一直到匹配或字符串空为止,如:

vars ="abbbaabbbaaabbb1234";
varre1=/.*bbb/g;//*是贪婪量词
re1.test(s);

这个匹配过程将从整个字符串开始:

re1.test("abbbaabbbaaabbb1234");//false ,则去掉最后一个字符4再继续
re1.test("abbbaabbbaaabbb123");//false ,则去掉最后一个字符3再继续
re1.test("abbbaabbbaaabbb12");//false ,则去掉最后一个字符2再继续
re1.test("abbbaabbbaaabbb1");//false ,则去掉最后一个字符1再继续
re1.test("abbbaabbbaaabbb");//true ,结束

在贪婪量词的后面加多一个?就变成了惰性量词,它的匹配过程相反,是从前面第一个开始,不匹配则加一个,如此循环直到字符串结束,以上面的为例子。

vars ="abbbaabbbaaabbb1234";
varre1=/.*?bbb/g;//*?是惰性量词
re1.test(s);

它的匹配过程如下:

re1.test("a");//false, 再加一个
re1.test("ab");//false, 再加一个
re1.test("abb");//false, 再加一个
re1.test("abbb");//true, 匹配了,保存这个结果,再从下一个开始
re1.test("a");//false, 再加一个
re1.test("aa");//false, 再加一个
re1.test("aab");//false, 再加一个
re1.test("aabb");//false, 再加一个
re1.test("aabbb");//true, 匹配了,保存这个结果,再从下一个开始

小结:

默认的贪婪匹配是从后往前匹配,最大长度的匹配,惰性匹配就是在量词后面加个?从字符串的前面开始匹配,最小长度的匹配

Javascript 相关文章推荐
csdn 博客的css样式 v3
Feb 24 Javascript
鼠标滚轮控制网页横向移动实现思路
Mar 22 Javascript
javascript数组快速打乱重排的方法
Jan 02 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
jQuery自定义动画函数实例详解(附demo源码)
Dec 10 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
Nov 02 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
Vue如何从1.0迁移到2.0
Oct 19 Javascript
JS装饰器函数用法总结
Apr 21 Javascript
vsCode安装使用教程和插件安装方法
Aug 24 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
Bootstrap的modal拖动效果
Dec 25 #Javascript
原生ajax处理json格式数据的实例代码
Dec 25 #Javascript
JS异步文件分片断点上传的实现思路
Dec 25 #Javascript
BootStrop前端框架入门教程详解
Dec 25 #Javascript
半个小时学json(json传递示例)
Dec 25 #Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
Dec 25 #Javascript
JS如何生成一个不重复的ID的函数
Dec 25 #Javascript
You might like
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
php随机输出名人名言的代码
2012/10/07 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
90后毕业生的求职信范文
2013/09/21 职场文书
营业员演讲稿
2013/12/30 职场文书
百日安全生产活动总结
2014/07/05 职场文书
服务行业标语口号
2015/12/26 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android