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 相关文章推荐
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
Jan 15 Javascript
jQuery选择器中含有空格的使用示例及注意事项
Aug 25 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
使用javascript实现监控视频播放并打印日志
Jan 05 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
详解Angularjs中的依赖注入
Mar 11 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
JS动画实现回调地狱promise的实例代码详解
Nov 08 Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 05 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自定义session示例分享
2014/04/22 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP内核探索之变量
2015/12/22 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
JS跨域总结
2012/08/30 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
Python入门篇之字符串
2014/10/17 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
陈欧广告词
2014/03/14 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
谢师宴答谢词
2015/01/05 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
2016年会开场白台词
2015/06/01 职场文书
运动会运动员赞词
2015/07/22 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技