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 限制输入和粘贴(IE,firefox测试通过)
Nov 14 Javascript
GreyBox技术总结(转)
Nov 23 Javascript
IE6下focus与blur错乱的解决方案
Jul 31 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
Dec 17 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
Js数组排序函数sort()介绍
Jun 08 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
Aug 25 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
VueJs组件之父子通讯的方式
May 06 Javascript
vue把输入框的内容添加到页面的实例讲解
Nov 11 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP 基本语法格式
2009/12/15 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
很可爱的输入框
2008/08/03 Javascript
Div Select挡住的解决办法
2008/08/07 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
Python序列化pickle模块使用详解
2020/03/05 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
用python计算文件的MD5值
2020/12/23 Python
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
德国高尔夫商店:Par71.de
2020/11/29 全球购物
工作表扬信的范文
2014/01/10 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书