js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析


Posted in Javascript onDecember 27, 2016

本文实例分析了js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法。分享给大家供大家参考,具体如下:

最近在阅读RequireJS 2.1.15源码,源码开始处定义了一系列的变量,有4个正则表达式:

var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
jsSuffixRegExp = /\.js$/,
currDirRegExp = /^\.\//;

commentRegExp正则用来匹配JavaScript代码中的注释,/m的用法可以参考这篇文章:https://3water.com/article/101399.htm,/g的用法参考这篇文章:https://3water.com/article/101408.htm。commentRegExp中的*?这种用法之前没有见过,觉得很奇怪,因为*在正则表达式中代表0个或任意多个,?代表0个或1个,刚开始觉得*?这种写法很多余。请教同事才知道,*?这种写法是懒惰匹配。

alert(/abc([\w]*)/mg.exec("abc1abc2")[0]);//abc1abc2
alert(/abc([\w]*?)/mg.exec("abc1abc2")[0]);//abc

通过下面这段代码可以看出:最长匹配和最短匹配的差别通过这段代码可以看出:最长匹配和最短匹配的差别,一个匹配尽可能多的字符,一个匹配尽可能少的字符。一般正则表达式引擎默认都是最长匹配的,如果我们想要最短匹配,那么可以在数量修饰符后面添加一个?变成最短匹配。

/***注释1****/ var name = "aty"; /***注释2****/
var name = "aty";

通过上面这段代码可以知道,为啥requirejs匹配javascript注释要采用*?这种最短匹配模式了吧。如果我们要删除所有注释,那么应该采用最短匹配,否则var name="aty";这段代码会被替换掉。

Javascript 相关文章推荐
javascript 内存回收机制理解
Jan 17 Javascript
分享几个超级震憾的图片特效
Jan 08 Javascript
SeaJS入门教程系列之使用SeaJS(二)
Mar 03 Javascript
JavaScript 面向对象与原型
Apr 10 Javascript
css如何让浮动元素水平居中
Aug 07 Javascript
angularjs学习笔记之完整的项目结构
Sep 26 Javascript
纯JS代码实现气泡效果
May 04 Javascript
JavaScript实现刷新不重记的倒计时
Aug 10 Javascript
js eval函数使用,js对象和字符串互转实例
Mar 06 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 Javascript
微信小程序修改swiper默认指示器样式的实例代码
Jul 18 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 #Javascript
JS正则表达式修饰符global(/g)用法分析
Dec 27 #Javascript
js点击任意区域弹出层消失实现代码
Dec 27 #Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 #Javascript
jQuery Validate插件自定义验证规则的方法
Dec 27 #Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 #Javascript
正则中的回溯定义与用法分析【JS与java实现】
Dec 27 #Javascript
You might like
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
面向对象设计模式的核心法则
2013/11/10 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
python通过函数属性实现全局变量的方法
2015/05/16 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
红旗团支部事迹材料
2014/01/27 职场文书
学雷锋宣传标语
2014/06/25 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python