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 设计模式 推荐
Oct 28 Javascript
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
Mar 14 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
Aug 11 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
javaScript基础详解
Jan 19 Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 Javascript
jQuery中on方法使用注意事项详解
Feb 15 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
在Vue中使用echarts的实例代码(3种图)
Jul 10 Javascript
Vue 组件封装 并使用 NPM 发布的教程
Sep 30 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 5.3.0 安装分析心得
2009/08/07 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
前端必学之PHP语法基础
2016/01/01 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP多进程编程实例详解
2017/07/19 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
python编程羊车门问题代码示例
2017/10/25 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
Python ellipsis 的用法详解
2020/11/20 Python
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
好员工观后感
2015/06/17 职场文书
入党申请书怎么写?
2019/06/21 职场文书