jQuery中充斥着大量的正则表达式,在jQuery不断改良的过程中,正则表达式的用法也在发生着变化。
其中变化最大的就是(?:pattern)的使用,当然还有?家族的一系列表达式用法。
mdn中对(?:pattern)是这样描述的:
Matches x but does not remember the match. These are called non-capturing groups. The matched substring can not be recalled from the resulting array's elements [1], ..., [n] or from the predefined RegExp object's properties $1, ..., $9.匹配 x 不会捕获匹配项。这被称为非捕获括号(non-capturing parentheses)。匹配项不能够从结果数组的元素 [1], ..., [n] 或已被定义的 RegExp 对象的属性 $1, ..., $9 再次访问到 |
---|
非捕获括号是什么?捕获括号又是什么?
先从match(), exec(), test()这三个方法说起,捕获括号在exec()的介绍中有涉及。
方法的区别
function getLength(reg,str){
var i=0;
while(reg.test(str)){
i++;
}
return i;
}
getLength(/a/g, "abaca") //print 3
var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = /[A-E]/gi;
var matches_array = str.match(regexp);console.log(matches_array);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
概念有点抽象,举个例子:
捕获括号与非捕获括号
不了解捕获括号的同志们可能会疑惑最后一个例子--a例子的输出结果。
捕获括号字面理解 去捕获字符串中的括号,既然捕获了内容,就要有个地方存放。先看下下面的例子,再重新读一下exec()的描述信息。
/a(c)(a)/g.exec("aca") //print ["aca", "c", "a"]
/a(c(a))/g.exec("aca") //print ["aca", "ca", "a"]
非捕获括号那不就是不去捕获这个括号的内容嘛
/a(?:c)(a)/g.exec("aca") //print ["aca", "a"]
/a(?:c(a))/g.exec("aca") //print ["aca", "a"]
/a(c(?:a))/g.exec("aca") //print ["aca". "ca"]
至于什么时候捕获括号,什么时候非捕获括号就要视情况而定了。灵活的使用这两者会有不一样的收获。
如果有兴趣,可以看一下下面的正则表达式
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/
这个正则表达式是jQuery的入口。