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()的介绍中有涉及。
方法的区别
- test() 执行一个检索,查看正则表达式与指定的字符串是否匹配。返回true 或false。也可以用字符串的search()方法代替。 语法: regexObj.test(str) str.search(regexp) 这两者也是有区别的。 search()每次调用都是从下标为0开始查询; test()方法不是全局匹配时与search()相同; test()是全局匹配时,下次执行则从查询出的匹配项的下标开始查询(第一次为0)。 例如:统计字符串中某个子字符串出现的次数
function getLength(reg,str){
var i=0;
while(reg.test(str)){
i ;
}
return i;
}
getLength(/a/g, "abaca") //print 3
- match() 提取字符串匹配到正则表达式的匹配项 语法:str.match(regexp) 返回值:一个包含匹配结果的数组,如果没有匹配项,则返回null。 描述: 如果正则表达式包含g标志,则该方法返回一个包含所有匹配结果的数组。 如果正则表达式没有g标志,返回和exec(str)相同的结果。 例子:
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']
- exec() 语法:regexObj.exec(str) 返回值:返回一个数组,并且更新正则表达式对象的属性(例如lastIndex)。而且返回的数组拥有一个额外的input属性,该属性包含原始字符串。另外,还拥有一个index属性,该属性表示匹配结果在原字符串中的索引。 返回的数组中,第一个元素是满足匹配的字符串,之后的元素是对应成功匹配被捕获的字符串的捕获括号(capturing parenthesis)。
概念有点抽象,举个例子:
- var str = "For more information, see Chapter 3.4.5.1"; var re = /(chapter d (.d)*)/i; var found = str.match(re); console.log(found); // logs ["Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1"]
捕获括号与非捕获括号
不了解捕获括号的同志们可能会疑惑最后一个例子--a例子的输出结果。
捕获括号字面理解 去捕获字符串中的括号,既然捕获了内容,就要有个地方存放。先看下下面的例子,再重新读一下exec()的描述信息。
代码语言:javascript复制/a(c)(a)/g.exec("aca") //print ["aca", "c", "a"]
/a(c(a))/g.exec("aca") //print ["aca", "ca", "a"]
非捕获括号那不就是不去捕获这个括号的内容嘛
代码语言:javascript复制/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*(<[wW] >)[^>]*|#([w-] ))$/
这个正则表达式是jQuery的入口。