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 相关文章推荐
客户端脚本中常常出现的一些问题和调试技巧
Jan 09 Javascript
Javascript 浮点运算的问题分析与解决方法
Aug 27 Javascript
ECMAScript6中Map/WeakMap详解
Jun 12 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
轻松实现js弹框显示选项
Sep 13 Javascript
浅谈JS使用[ ]来访问对象属性
Sep 21 Javascript
bootstrap 设置checkbox部分选中效果
Apr 20 Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
微信公众平台获取access_token的方法步骤
Mar 29 Javascript
javascript实现评分功能
Jun 24 Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 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重定向的3种方式
2013/03/07 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
php搜索文件程序分享
2015/10/30 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
理解JSON:3分钟课程
2011/10/28 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
Angular之toDoList的实现代码示例
2017/12/02 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
JS异步处理的进化史深入讲解
2019/08/25 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
Python常用模块用法分析
2014/09/08 Python
python实现按行切分文本文件的方法
2016/04/18 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
经典的毕业生自荐信范文
2014/04/14 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
房屋产权证明书
2014/10/15 职场文书
公司搬迁通知
2015/04/20 职场文书
推广普通话的宣传语
2015/07/13 职场文书
运动会加油稿50字
2015/07/21 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript