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 函数的执行环境和作用域链的深入解析
Nov 01 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
Mar 18 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
May 23 Javascript
js判断滚动条是否已到页面最底部或顶部实例
Nov 20 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
Jul 30 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
Feb 26 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
摘自启点的main.js
2008/04/20 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
bootstrap table实例详解
2017/01/06 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
python中的逆序遍历实例
2019/12/25 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
新护士岗前培训制度
2014/02/02 职场文书
个人存款证明书
2014/10/18 职场文书
工地食品安全责任书
2015/05/09 职场文书
运动会加油稿
2015/07/22 职场文书
学校教学管理制度
2015/08/06 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis
python中的sys模块和os模块
2022/03/20 Python