jQuery源码中的chunker 正则过滤符分析


Posted in Javascript onJuly 31, 2012
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,

这是Jq中最长的一个正则了,也研究了很久,一直很懵懂,感觉还是通过调试,然后一步一步的分析值理解起来比较容易,

我尝试做成图形比较直观一点,以不同的颜色区分了一下,如下图:

jQuery源码中的chunker 正则过滤符分析
分组一是通过以下代码逐一拆分成一个数组的:

// 此处循环的作用是拆分每个选择器到 parts 数组,比如div#id>p ul li 拆分成['div#id','>','p','ul','li'] 
while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { 
// soFar存储的是过滤了第一层后的选择符字符串,也就是图片上的分组三 
soFar = m[3]; 
//选择器块第一部分推入数组 
parts.push( m[1] ); 
// 如果拆分到了逗号的地方',',则前一组结束,跳出循环,到另外一组选择器了 
if ( m[2] ) { 
// 记录另外一组选择器 
extra = m[3]; 
break; 
} 
}

其它的比如ID,class之类的就好理解了
match: { 
// \u00c0-\uFFFF 匹配多个国家或名族的字母文字 
ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, //如:#myId 
CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, // 如:.myClass 
NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, //如:[name="myName"] 
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, //如:[attribute="value"] 
TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, //如:div p a 
CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, //如::first-child or :nth-child(5n+1) 
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, //如::nth(3) span 
PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ // :jlkj\kjl('kl(kklk)kl') 
}

未完待续……
Javascript 相关文章推荐
javascript FormatNumber函数实现方法
Dec 30 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
Dec 28 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
详解jquery validate实现表单验证 (正则表达式)
Jan 18 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
Vue.js 动态为img的src赋值方法
Mar 14 Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 #Javascript
基于jquery的点击链接插入链接内容的代码
Jul 31 #Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 #Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
Jul 31 #Javascript
jQuery.each()用法分享
Jul 31 #Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 #Javascript
JavaScript中的私有/静态属性介绍
Jul 26 #Javascript
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
用js实现in_array的方法
2013/11/05 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
微信JS接口大全
2016/08/25 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
简述vue中的config配置
2018/01/23 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python列表操作实例
2015/01/14 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
python 实现线程之间的通信示例
2020/02/14 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
自动一体化专业求职信
2014/03/15 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
初中信息技术教学计划
2015/01/22 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
python之json文件转xml文件案例讲解
2021/08/07 Python