JS 学习总结之正则表达式的懒惰性和贪婪性


Posted in Javascript onJuly 03, 2017

exec - > 正则的捕获

每一次捕获的时候都是先进行默认的匹配,如果没有匹配成功的,捕获的结果是null;只有有匹配的内容我们才能捕获到;

捕获的内容格式

1、捕获到的内容是一个数组,数组中的第一项是当前正则捕获的内容

index:捕获内容在字符串中开始的索引位置

input:捕获的原始字符串

var reg = /\d+/;
var str = 'woshi2016ni2017';
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'woshi2016ni2017']
//第二次通过exec捕获的内容还是第一个"2016"
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'woshi2016ni2017']

2、正则捕获的特点

1)、懒惰性->每一次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,在执行多次捕获,捕获的还是第一个匹配的内容。

lastIndex:是正则每一次捕获在字符串中开始查找的位置,默认值为0

2)、如何解决懒惰性?在正则的末尾加一个修饰符"g"

修饰符:g、i、m

global(g):全局匹配

ignoreCase(i):忽略大小写匹配

multiline(m):多行匹配

var reg = /\d/g;
var str = 'woshi2016ni2017';
console.log(reg.lastIndex)
console.log(reg.exec(str))

 

原理:加了全局修饰符g,正则每一次捕获结束后,我们的lastIndex的值都变成了最新的值,下一次捕获从最新的位置开始查找,这样就可以把所有需要捕获的内容都获取到了

3)、自己编写程序获取正则捕获的所有的内容(一定不要忘了加g)

var reg = /\d+/g;
    var str = 'aswofde2015xsewde2016awdefer2017';
    var ary = [];
    var res = reg.exec(str);
    while(res){
      ary.push(res[0])
      res = reg.exec(str);
    }
    console.log(ary)//[2015,2016,2017]

4)、贪婪性   正则的每一次捕获都是按照匹配最长的结果捕获的,例如:2符合正则、2015也符合正则,我们默认捕获的是2015

5)、如何解决正则的贪婪性 ->在量词元字符后面添加一个?即可 

var reg = /\d+?/g;
    var str = 'aswofde2015xsewde2016awdefer2017';
    console.log(reg.exec(str));

?在正则中有很多的作用:

放在一个普通的元字符后面代表出现0-1次 /\d?/  ->数字可能出现也可能不出现

放在一个量词的元字符后面是取消捕获时候的贪婪性

3、字符串中的match方法->把所有和正则匹配的字符都获取到

var reg = /\d+?/g;
    var str = 'aswofde2015xsewde2016awdefer2017';
    var ary = str.match(reg);//[2,0,1,5,2,0,1,6,2,0,1,7]

虽然在当前的情况下match比我们的exec更加的简便一些,但是match中存在一些自己处理不了的问题,在分组的捕获的情况下,match只能捕获大正则匹配的内容,而对于小正则捕获的内容是无法获取的

以上所述是小编给大家介绍的JS 学习总结之正则表达式的懒惰性和贪婪性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
jquery中通过父级查找进行定位示例
Jun 28 Javascript
jQuery打印指定区域Html页面并自动分页
Jul 04 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
使用Web Uploader实现多文件上传
Jun 08 Javascript
AngularJS轻松实现双击排序的功能
Aug 30 Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
BootStrap实现带关闭按钮功能
Feb 15 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 #Javascript
微信小程序开发中的疑问解答汇总
Jul 03 #Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 #Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 #Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 #Javascript
JavaScript之class继承_动力节点Java学院整理
Jul 03 #Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 #Javascript
You might like
php 团购折扣计算公式
2011/11/24 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
python复制文件到指定目录的实例
2018/04/27 Python
python画图的函数用法以及技巧
2019/06/28 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python chardet库识别编码原理解析
2020/02/18 Python
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
大专生的学习自我评价
2013/12/04 职场文书
打架检讨书800字
2014/01/10 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
大学生社团活动总结
2014/04/26 职场文书
外联部演讲稿
2014/05/24 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
美容院员工规章制度
2015/08/05 职场文书
导游词之广州陈家祠
2019/10/21 职场文书