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 相关文章推荐
一个js控制的导航菜单实例代码
Dec 03 Javascript
toggle()隐藏问题的解决方法
Feb 17 Javascript
浅析AngularJS中的生命周期和延迟处理
Jun 18 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
Dec 08 Javascript
微信小程序 闭包写法详细介绍
Dec 14 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
layui radio性别单选框赋值方法
Aug 15 Javascript
JS实现图片拖拽交换效果
Nov 30 Javascript
Vue 幸运大转盘实现思路详解
May 06 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 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
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
图片自动更新(说明)
2006/10/02 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
Django 导出 Excel 代码的实例详解
2017/08/11 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
python集合的新增元素方法整理
2020/12/07 Python
如何通过python检查文件是否被占用
2020/12/18 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
保荐人的岗位职责
2013/11/19 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
小学师德师风整改措施
2014/10/27 职场文书
介绍信样本
2015/01/31 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
开学第一周总结
2015/07/16 职场文书