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 相关文章推荐
修复ie8&chrome下window的resize事件多次执行
Oct 20 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
返回函数的JavaScript函数
Jun 14 Javascript
vue.js实例todoList项目
Jul 07 Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 17 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 Javascript
React Fragment介绍与使用详解
Nov 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
php 购物车实例(申精)
2009/05/11 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
javaScript语法总结
2016/11/25 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python中时间模块的基本使用教程
2019/05/14 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
python如何绘制疫情图
2020/09/16 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
物理教师自荐信范文
2013/12/28 职场文书
初中学习计划书范文
2014/09/15 职场文书
群众路线专项整治方案
2014/10/27 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2014年公务员工作总结
2014/11/18 职场文书
个人学习总结范文
2015/02/15 职场文书
党组织结对共建协议书
2016/03/23 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android