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 相关文章推荐
MSN消息提示类
Sep 05 Javascript
Javascript !!的作用
Dec 04 Javascript
jQuery 对Select的操作备忘记录
Jul 04 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
Feb 03 Javascript
JS正则表达式验证数字代码
Jan 28 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
Aug 29 Javascript
JavaScript Date对象应用实例分享
Oct 30 Javascript
vue头部导航动态点击处理方法
Nov 02 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 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数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
python生成器的使用方法
2013/11/21 Python
20招让你的Python飞起来!
2016/09/27 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
python 多线程串行和并行的实例
2019/02/22 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
python实现简单猜单词游戏
2020/12/24 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
传播学专业毕业生自荐信
2013/11/04 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
校长岗位职责
2013/11/26 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
学校节能减排倡议书
2014/05/16 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
工程催款通知书
2015/04/17 职场文书
2015中学学校工作总结
2015/07/20 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP