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 相关文章推荐
js利用Array.splice实现Array的insert/remove
Jan 13 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
Nov 20 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
Vue实现动态响应数据变化
Apr 28 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
Node.js console控制台简单用法分析
Jan 04 Javascript
Vue起步(无cli)的啊教程详解
Apr 11 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
js实现无限层级树形数据结构(创新算法)
Feb 27 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
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
Python 基础教程之str和repr的详解
2017/08/20 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Python偏函数实现原理及应用
2020/11/20 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
Shell编程面试题
2016/05/29 面试题
新兵入伍心得体会
2014/09/04 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
民事诉讼代理词
2015/05/25 职场文书
银行工作心得体会范文
2016/01/23 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android