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 相关文章推荐
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
Javascript中的String对象详谈
Mar 03 Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
canvas知识总结
Jan 25 Javascript
js实现随机点名系统(实例讲解)
Oct 18 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
Nov 02 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
Jul 18 Javascript
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
基于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绘制饼状图的实现代码
2013/06/07 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python导入时小括号大作用
2017/01/10 Python
Python Socket使用实例
2017/12/18 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
银行实习生的自我评价
2013/12/09 职场文书
分家协议书
2014/04/21 职场文书
伊索寓言教学反思
2014/05/01 职场文书
街道务虚会发言材料
2014/10/20 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL