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 分页控件实现代码
Nov 30 Javascript
JavaScript中获取元素索引的函数
Sep 10 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
基于JavaScript实现动态创建表格和增加表格行数
Dec 20 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
JS实现根据文件字节数返回文件大小的方法
Aug 02 Javascript
jquery插件bootstrapValidator表单验证详解
Dec 15 Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 Javascript
npm 更改默认全局路径以及国内镜像的方法
May 16 Javascript
基于Vue+element-ui 的Table二次封装的实现
Jul 20 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
Oct 16 Javascript
JavaScript实现好看的跟随彩色气泡效果
Feb 06 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
php面向对象重点知识分享
2019/09/27 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python自动化工具之pywinauto实例详解
2019/08/26 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
上海微创软件面试题
2012/06/14 面试题
实习教师个人的自我评价
2013/11/08 职场文书
高中班长自我鉴定
2013/12/20 职场文书
吨的认识教学反思
2014/04/27 职场文书
关于读书的活动方案
2014/08/14 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
读书笔记怎么写
2015/07/01 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL