前段时间,看了zepto.js的源码,顺便对正则表达式做了一些回顾。
首先,先来看一下正则表达式的一些常见语法。
1、 (pattern)、(?:pattern)、(?=pattern)、(?!pattern)字符的说明
- (pattern):匹配pattern并捕获该匹配的子表达式。如:"mytest".match(/y(test)/ig); //["ytest", "test"];
- (?:pattern):匹配pattern并不捕获匹配的子表达式。如:"mytest".match(/y(?:test)/ig); //["ytest"];
- (?=pattern):执行正向预测先行搜索的子表达式,该表达式匹配处于匹配的字符串的起始点的字符串,是一个非捕获匹配。如:"mytest".match(/y(?=test)/ig); //["y"];
- (?!pattern):执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配的字符串的起始点的搜索字符串,也是一个非捕获匹配。如:"mytest".match(/y(?!est)/ig);//["y"]。
2、RegExp对象与正则表达式字面量
看一下以下两个正则表达式:
var p1 = /\stest/i;
p1.test(('it test'); //true;
var p2 = new RegExp('\\stest', 'i');
p2.test('it test');//true
p1 和 p2是两个完全等价的正则表达式。需要注意的是,传递给RegExp构造函数的两个参数都是字符串,所以所有元字符都必须双重转义,如p2中的\s必须转义为\s,才能表示为空白字符,同时不能把正则表达式字面量直接传递给RegExp构造函数。
现在,我们来看一下zepto.js中出现的一些正则表达式。
- /^\s*<(\w+|!)[^>]*>/ :检测空白字符(允许0个或多个)开头的标签或者doctype标签;
- /^<(\w+)\s*/?>(?:</\1>|)$/ :检测html中的单标签,如<a></a>,<br />;
- /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)/>/ig : 检测一些自定义的HTML单标签;
- /^(?:body|html)$/i : 非捕获检测body标签或者html标签;
- /([A-Z])/g :检测大写字母;
- new RegExp('(^|\s)' + name + '(\s|$)') : 如new RegExp('(^|\s)active(\s|$)') 与 /(^|\s)active(\s|$)/正则表达式相同,这个表达式用于检测html标签class属性中出现的类。