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 相关文章推荐
IE 条件注释详解总结(附实例代码)
Aug 29 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
js数组去重的常用方法总结
Jan 24 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
浅析javaScript中的浅拷贝和深拷贝
Feb 15 Javascript
详解swiper在vue中的应用(以3.0为例)
Sep 20 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 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
smarty内置函数config_load用法实例
2015/01/22 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
取选中的radio的值
2010/01/11 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
vue和webpack安装命令详解
2018/06/15 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python编写生成验证码的脚本的教程
2015/05/04 Python
python抓取百度首页的方法
2015/05/19 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
浅谈flask源码之请求过程
2018/07/26 Python
python实现websocket的客户端压力测试
2019/06/25 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
英语自荐信常用语句
2013/12/13 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
MySQL基础(一)
2021/04/05 MySQL
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers