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 得到当前页面高度和宽度的两个函数
Feb 21 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
Oct 14 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
jQuery实现可移动选项的左右下拉列表示例
Dec 26 Javascript
JavaScript基础之流程控制语句的用法
Aug 31 Javascript
详解基于mpvue的小程序markdown适配解决方案
May 08 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
django 发送手机验证码的示例代码
2018/04/25 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
python db类用法说明
2020/07/07 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
航空大学应届生求职信
2013/11/10 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
运动会广播稿200米
2014/01/27 职场文书
电子信息专业自荐书
2014/02/04 职场文书
安踏广告词改编版
2014/03/21 职场文书
综合内勤岗位职责
2014/04/14 职场文书
关于青春的演讲稿
2014/05/05 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
高中生毕业评语
2014/12/30 职场文书
人事任命书范本
2015/09/21 职场文书
golang日志包logger的用法详解
2021/05/05 Golang