我们能从 jQuery 的一个正则表达式中学到什么?
注意,该篇文章当前为粗糙的 v0.9 版本,会在稍后润色更新。
让我们来看一道思考题,根据 rejectExp,分析其正则执行过程中如何进行过滤?包含哪些执行步骤?
rejectExp 变量的值如下:
var rejectExp = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
在 jQuery.3.4.0 中,该正则表达式命名为 rsingleTag 大概是 read single tag 的意思,是比较容易读懂的命名,但是我觉得命名 tagNameMatchers 会更好。
其次这个正则表达式的目的就是剥离掉标签的< 和 /> 等符号,只保留标签名称,为了方便理解,我们可以将整个正则表达式分为两个部分:
^<(\w+)\s*\/?>(?:<\/\1>|)$
让我们一起「读」一下这个正则表达式的第一部分:匹配所有以 < 开头的(^<),一个或多个大小写字符,数字或下划线,并将匹配结果放到正则寄存器中((\w+)),之后匹配紧接着的任意个空白字符(\s*),以及可有可无的一个 / 字符(\/?),紧接着一个 > 字符(>)。
在这个部分中,亮点的操作是实际上指定了我们要捕获 Tag 名称字符,这意味着到时候这个字符会放在正则的寄存器里(马上我们就要用到了)。
现在我们来看看第二部分,接着读:
上面的字符必须要以括号里的部分结尾,但是我并不需要引用匹配结果,为了提升性能,不要把匹配结果放在正则寄存器里(?:(...)$)。注意,这个 ?: 就是指不要把匹配结果放在寄存器里的意思。
然后括号里有两个骚操作:
<\/\1>:这里\1使用了正则的“反向引用”的功能,把我们刚才放在寄存器里的匹配结果拿出来使用了,这样我们就不需要再写一遍相同的正则表达式,这非常符合 DRY 原则;<...>|:注意这里的|是指 “或”,这个符号右侧为空,是为了匹配<br />这样的自闭和标签,如果你少了这个字符,你就没法获取自闭和标签了,你可以自己试试看;
这下整个正则表达式的含义应该就很明晰了,我就不针对第二部分再逐字过一遍了,相信你一定 Get 到了这个正则表达式的关键点。
小结一下,通过这个正则表达式我们学到了什么?
- 使用非捕获元
?:告诉正则不缓存匹配结果以提升性能; - 使用反向引用来遵守 DRY 原则;
- 使用
|右边却什么也不写代表什么都不匹配;
小小的正则表达式却有大大的学问,没想到吧?
我们能从 jQuery 的一个正则表达式中学到什么?的更多相关文章
- 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。
用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...
- 用jQuery判断一个元素的各种状态
用jQuery判断一个元素是否显示 用jQuery判断一个元素是否显示:$(element).is(":visible"); 类似的,判断一个元素是不是第一个子元素:$(ele ...
- 通过一个正则表达式,让SQL Server数据库的带参sql也支持位置参数语法!
.NET Framework 2.0 中,Microsoft 在 System.Data.Common 名称空间下定义了一组类用来让程序员编写适用于不同数据库的数据访问代码,而且还在 Enterpri ...
- 类似jquery的一个demo
通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...
- 用Jquery做一个时间日期选择器
今天我们就用Jquery做一个时间日期选择器,当打开网页时,文本框里面显示的是当前的日期,点击文本框可以出现年.月.日的下拉菜单,并且可以选择,会根据年份的选择判断是否是闰年,从而改变二月的天数,闰年 ...
- 使用vba做一个正则表达式提取文本工具
测试中经常会遇到对数据的处理,比如我要删除某些特定数据,数据源是从网页请求中抓取,这时候可能复制下来一大堆内容,其中我们只需要特定的某些部分,笔者通常做法是拷贝到notepad++中处理,结合RegT ...
- 利用js和JQuery定义一个导航条菜单
利用js和JQuery定义一个导航条 效果: 一.html代码: <div class="Maintenance"> <div class="Title ...
- 一个正则表达式,只含有汉字、数字、字母、下划线,下划线位置不限【Z】
1.一个正则表达式,只含有汉字.数字.字母.下划线不能以下划线开头和结尾: ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中: ^ 与字符串开始的地方匹配 ( ...
- jQuery生成一个DIV容器,ID是"rating".
我们需要一些服务器端代码,这个例子中用到了一个PHP文件,读取rating参数然后返回rating总数和平均数.看一下rate.php代码.虽然这些例子也可以不使用AJAX来实现,但显示我们不会那么做 ...
随机推荐
- 优云亮相GOPS2017全球运维大会 “黑科技”获全场最高关注
2017年4月21日,GOPS――2017全球运维大会于深圳・圣淘沙酒店拉开帷幕.GOPS全球运维大会由高效运维社区(GreatOPS)和开放运维联盟(OOPSA)联合主办,由工信部信通院数据中心联盟 ...
- gulp自动化部署:gulp发布express项目(二)
原文:https://my.oschina.net/songzhu/blog/610337 一.服务器准备 服务器ip地址为:172.16.70.174 1.安装 Node.js 参考:http:// ...
- 发送html内容的email(转)
html中无法使用css, js.你发送一个<div>片断就好了,不用写整个html页面,因为即使写了,邮件客户端也会删除body之外(包括<body>这个标签)的内容,只留下 ...
- Hadoop的那些事儿(转)
原文:http://www.searchtb.com/tag/mapreduce 在说Hadoop之前,作为一个铁杆粉丝先粉一下Google.Google的伟大之处不仅在于它建立了一个强悍 ...
- html_parser
import json from lxml import etree class HtmlParser(object): """这是HtmlParser"&qu ...
- sql server维护解决方案(备份、检查完整性、索引碎片整理)
请务必看原文 原文:https://ola.hallengren.com/frequently-asked-questions.html 经常问的问题 入门 如何开始使用SQL Server维护解决方 ...
- Python绘图工具matplotlib的使用(图形并茂)
matplotlib官网文档: http://matplotlib.org/gallery.html 支持win7_64_bit的matplotlib库下载网址: http://www.lfd.uci ...
- JVM学习笔记-内存管理
第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描写叙述的是java方法执行的内存模 ...
- CSS表格(未完成)
CSS 表格 使用 CSS 可以使 HTML 表格更美观. 表格边框 指定CSS表格边框,使用border属性. 下面的例子指定了一个表格的Th和TD元素的黑色边框:
- Py中的多维数组ndarray学习【转载】
转自:http://blog.sciencenet.cn/home.php?mod=space&uid=3031432&do=blog&id=1064033 1. NumPy中 ...