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 相关文章推荐
图片连续滚动代码[兼容IE/firefox]
Jun 11 Javascript
js中replace的用法总结
Dec 27 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
Aug 17 Javascript
Node.js学习入门
Jan 03 Javascript
十大热门的JavaScript框架和库
Mar 21 Javascript
微信JS-SDK选取手机照片上传功能
Apr 21 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
Jul 09 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
利用10行js代码实现上下滚动公告效果
Dec 08 Javascript
React.js绑定this的5种方法(小结)
Jun 05 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
vue实现购物车列表
Jun 30 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
php全局变量和类配合使用深刻理解
2013/06/05 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript SHA512&SHA256加密算法详解
2015/08/11 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
vue中的数据绑定原理的实现
2018/07/02 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python封装对象实现时间效果
2020/04/23 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
工厂保洁员岗位职责
2013/12/04 职场文书
大学生村官演讲稿
2014/04/25 职场文书
会计系毕业生求职信
2014/05/28 职场文书
学校欢迎标语
2014/06/18 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL