注意,该篇文章当前为粗糙的 v0.9 版本,会在稍后润色更新。

让我们来看一道思考题,根据 rejectExp,分析其正则执行过程中如何进行过滤?包含哪些执行步骤?

rejectExp 变量的值如下:

var rejectExp = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;

在 jQuery.3.4.0 中,该正则表达式命名为 rsingleTag 大概是 read single tag 的意思,是比较容易读懂的命名,但是我觉得命名 tagNameMatchers 会更好。

其次这个正则表达式的目的就是剥离掉标签的</> 等符号,只保留标签名称,为了方便理解,我们可以将整个正则表达式分为两个部分:

  1. ^<(\w+)\s*\/?>
  2. (?:<\/\1>|)$

让我们一起「读」一下这个正则表达式的第一部分:匹配所有以 < 开头的(^<),一个或多个大小写字符,数字或下划线,并将匹配结果放到正则寄存器中((\w+)),之后匹配紧接着的任意个空白字符(\s*),以及可有可无的一个 / 字符(\/?),紧接着一个 > 字符(>)。

在这个部分中,亮点的操作是实际上指定了我们要捕获 Tag 名称字符,这意味着到时候这个字符会放在正则的寄存器里(马上我们就要用到了)。

现在我们来看看第二部分,接着读:

上面的字符必须要以括号里的部分结尾,但是我并不需要引用匹配结果,为了提升性能,不要把匹配结果放在正则寄存器里(?:(...)$)。注意,这个 ?: 就是指不要把匹配结果放在寄存器里的意思。

然后括号里有两个骚操作:

  1. <\/\1>:这里 \1 使用了正则的“反向引用”的功能,把我们刚才放在寄存器里的匹配结果拿出来使用了,这样我们就不需要再写一遍相同的正则表达式,这非常符合 DRY 原则;
  2. <...>|:注意这里的 | 是指 “或”,这个符号右侧为空,是为了匹配 <br /> 这样的自闭和标签,如果你少了这个字符,你就没法获取自闭和标签了,你可以自己试试看;

这下整个正则表达式的含义应该就很明晰了,我就不针对第二部分再逐字过一遍了,相信你一定 Get 到了这个正则表达式的关键点。

小结一下,通过这个正则表达式我们学到了什么?

  1. 使用非捕获元 ?: 告诉正则不缓存匹配结果以提升性能;
  2. 使用反向引用来遵守 DRY 原则;
  3. 使用 | 右边却什么也不写代表什么都不匹配;

小小的正则表达式却有大大的学问,没想到吧?

我们能从 jQuery 的一个正则表达式中学到什么?的更多相关文章

  1. 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。

    用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...

  2. 用jQuery判断一个元素的各种状态

    用jQuery判断一个元素是否显示   用jQuery判断一个元素是否显示:$(element).is(":visible"); 类似的,判断一个元素是不是第一个子元素:$(ele ...

  3. 通过一个正则表达式,让SQL Server数据库的带参sql也支持位置参数语法!

    .NET Framework 2.0 中,Microsoft 在 System.Data.Common 名称空间下定义了一组类用来让程序员编写适用于不同数据库的数据访问代码,而且还在 Enterpri ...

  4. 类似jquery的一个demo

    通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...

  5. 用Jquery做一个时间日期选择器

    今天我们就用Jquery做一个时间日期选择器,当打开网页时,文本框里面显示的是当前的日期,点击文本框可以出现年.月.日的下拉菜单,并且可以选择,会根据年份的选择判断是否是闰年,从而改变二月的天数,闰年 ...

  6. 使用vba做一个正则表达式提取文本工具

    测试中经常会遇到对数据的处理,比如我要删除某些特定数据,数据源是从网页请求中抓取,这时候可能复制下来一大堆内容,其中我们只需要特定的某些部分,笔者通常做法是拷贝到notepad++中处理,结合RegT ...

  7. 利用js和JQuery定义一个导航条菜单

    利用js和JQuery定义一个导航条 效果: 一.html代码: <div class="Maintenance"> <div class="Title ...

  8. 一个正则表达式,只含有汉字、数字、字母、下划线,下划线位置不限【Z】

    1.一个正则表达式,只含有汉字.数字.字母.下划线不能以下划线开头和结尾: ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中: ^ 与字符串开始的地方匹配 ( ...

  9. jQuery生成一个DIV容器,ID是"rating".

    我们需要一些服务器端代码,这个例子中用到了一个PHP文件,读取rating参数然后返回rating总数和平均数.看一下rate.php代码.虽然这些例子也可以不使用AJAX来实现,但显示我们不会那么做 ...

随机推荐

  1. Jmeter(十一)_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  2. curl获取公网IP地址

    curl ip.cn curl cip.cc https://blog.csdn.net/orangleliu/article/details/51994513 https://blog.csdn.n ...

  3. Intel 设计缺陷背后的原因是什么? | Linux 中国

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79386769 wx_fmt=jpeg& ...

  4. 查看crontab的日志记录定位定时任务问题

    1.linux 看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察 2.unix 在 /var/spool/cron/tmp文件中,有croutXXX0 ...

  5. Elasticsearch Date类型使用技巧

    elasticsearch原生支持date类型.这里简单记录下使用的方法. 使用date类型可以用如下两种方式: 使用毫秒的时间戳,直接将毫秒值传入即可. 传入格式化的字符串,默认是ISO 8601标 ...

  6. jquery closest & parent比较

    .closest() .parents() 从当前元素开始 从父元素开始 沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止. 沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加 ...

  7. NPOI 导出excel 分表

    /// <summary> /// 由DataTable导出Excel[超出65536自动分表] /// </summary> /// <param name=" ...

  8. 《Bilateral Multi-Perspective Matching for Natural Language Sentences》(句子匹配)

    问题: Natural language sentence matching (NLSM),自然语言句子匹配,是指比较两个句子并判断句子间关系,是许多任务的一项基本技术.针对NLSM任务,目前有两种流 ...

  9. 原生 ajax

    1.创建XMLHttpRequest对象 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Ope ...

  10. SQL语句--查询任务

    SELECT 目标字段1, 目标字段2 FROM 目标表WHERE ID IN(SELECT 外键 FROM 外键所在表WHERE 提供数据字段 IN(提供数据第一条, 提供数据第二条, ))