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 相关文章推荐
javascript显示选择目录对话框的代码
Nov 10 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
Aug 21 Javascript
详解JavaScript对象序列化
Jan 19 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
浅谈JS使用[ ]来访问对象属性
Sep 21 Javascript
jquery append与appendTo方法比较
May 24 jQuery
基于jQuery和CSS3实现APPLE TV海报视差效果
Jun 16 jQuery
angularjs 的数据绑定实现原理
Jul 02 Javascript
Javascript实现关闭广告效果
Jan 29 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
python数据结构之链表详解
2017/09/12 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
结构和类有什么异同
2012/07/16 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
生产内勤岗位职责
2013/12/07 职场文书
工业自动化毕业生自荐信范文
2014/01/04 职场文书
大学校运会广播稿
2014/02/03 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
高三霸气励志标语
2014/06/24 职场文书
2016新年问候语大全
2015/11/11 职场文书
竞聘书的秘诀
2019/04/02 职场文书
创业计划书介绍
2019/04/24 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
python中print格式化输出的问题
2021/04/16 Python
mysql left join快速转inner join的过程
2021/06/30 MySQL
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python