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实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
基于jQuery的倒计时实现代码
May 30 Javascript
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 Javascript
实例讲解避免javascript冲突的方法
Jan 03 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
Sep 09 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 Javascript
JS中的一些常用的函数式编程术语
Jun 15 Javascript
JavaScript原始值与包装对象的详细介绍
May 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
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
解析php取整的几种方式
2013/06/25 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
JavaScript使用cookie
2007/02/02 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
使用js画图之饼图
2015/01/12 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
Python3基础之list列表实例解析
2014/08/13 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
Python os模块学习笔记
2015/06/21 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
Python银行系统实战源码
2019/10/25 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
中专生自我鉴定
2013/12/17 职场文书
个人求职信范例
2014/01/29 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
安全环保演讲稿
2014/08/28 职场文书
python字符串常规操作大全
2021/05/02 Python
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis