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 获取页面的高度及滚动条的位置的代码
May 06 Javascript
使用javascipt---实现二分查找法
Apr 10 Javascript
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
vue中component组件的props使用详解
Sep 04 Javascript
vue.js中created方法作用
Mar 30 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
Aug 16 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 文件状态缓存带来的问题
2008/12/14 PHP
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php命名空间学习详解
2014/02/27 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
Prototype Class对象学习
2009/07/19 Javascript
JavaScript 常用函数
2009/12/30 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
Python获取任意xml节点值的方法
2015/05/05 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
Linux下多个Python版本安装教程
2018/08/15 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
校园安全检查制度
2014/02/03 职场文书
世界环境日活动总结
2015/02/11 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android