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事件绑定.on()简要概述及应用
Feb 07 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 Javascript
js实现3d悬浮效果
Feb 16 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
JS实现带导航城市列表以及输入搜索功能
Jan 04 Javascript
js序列化和反序列化的使用讲解
Jan 19 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 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 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
js DOM模型操作
2009/12/28 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
Python Queue模块详解
2014/11/30 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
Python subprocess库的使用详解
2018/10/26 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
python中时间模块的基本使用教程
2019/05/14 Python
python的依赖管理的实现
2019/05/14 Python
python多线程下信号处理程序示例
2019/05/31 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
几个Shell Script面试题
2012/08/31 面试题
网上商城创业计划书范文
2014/01/31 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
就业协议书范本
2014/10/08 职场文书
2015年少先队活动总结
2015/03/25 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers