jQuery源码中多处使用正则表达式处理字符串,现挑选其中部分正则表达式加于研究,以加深对正则表达式的理解,巩固知识。本次涉及到的javascript正则表达式的概念有:组合、选择、引用。
quickExpr = /^(?:[^#<]*(<[wW]+>)[^>]*$|#([w-]*)$)/;
该正则表达式匹配以下两种情况:
(1)html字符串:多个标签selector = '<p><span>正则</span></p>';单个标签selector = '<span>正则</span>';
(2)以#开头字符串:selector = '#myId';
1 match = quickExpr.exec( selector );
方法exec:如果字符串与正则表达式匹配,则返回一个数组,该数组第一个元素为正则表达式所匹配的字符串值。第二个元素开始则是正则表达式的组合所匹配的子字符串值,所谓组合即是用括号括起来的部分,比如(<[wW]+>)和([w-]*),(?:)括起来的部分也表示组合但不能引用它所匹配的字符串值,即它括起来的部分匹配的字符串不会放入match数组中,也不能通过RegExp.$索引号或索引号的方式引用。引用的索引号是根据括号从左到右的顺序计算的,比如正则表达/^(?:[^#<]*(<[wW]+>)[^>]*$|#([w-]*)$)/中,由于(?:)括起来的的组合不能引用,因此(<[wW]+>)的索引号为1,([w-]*)的索引号为2。如果字符串与正则表达式不匹配,则返回null。根据以上分析
match = quickExpr.exec( selector );执行结果如下:
第一种情况:
1 match = ['<p><span>正则</span></p>','<p><span>正则</span></p>',undefined]; 2 match = ['<span>正则</span>','<span>正则</span>',undefined];
第二种情况:
1 match = ['#myId',undefined,'myId'];
rsingleTag = /^<(w+)s*/?>(?:</1>)?$/;
该正则表达式匹配单个html标签,有以下两种形式:
(1)有闭合标签:selector = '<span></span>';
(2)无闭合标签:selector = '<img src="../image.jpg" style="12px;height:12px;border:0;" />';
ret = rsingleTag.exec( selector );
(w+)为第一个组合。(?:</1>)为只组合不引用,与之匹配的字符串不能被引用。1为反向引用,所引用的是第一个组合所匹配的值,这里的意思是必须与第一个组合的匹配的字符串配对,比如与(w+)匹配的字符串是span,则1匹配的字符串必须是span。
根据(一)对exec方法、组合、引用的解释,ret = rsingleTag.exec( selector );的执行结果如下:
(1)有闭合标签情况:
ret = ['<span></span>','span'];
(2)无闭合标签情况:
ret = ['<img />','img'];