捕获性分组 vs. 非捕获性分组
捕获性分组(...)就是捕获分组所匹配的内容暂且存储在某个地方,以便下次使用,捕获性分组以(...)表示,有些地方将取得捕获性分组所匹配结果的过程称之为"反向引用"
非捕获性分组不捕获分组所匹配的内容,当然也就得不到匹配的结果,非捕获性分组以(?:...)表示,在一些只需要分组匹配但是并不需要得到各个分组匹配的结果时,使用非捕获性分组可以提高匹配速度
var now = "25/10/2009";
/(\d\d)\/(\d\d)\/(\d\d\d\d)/.test(now);
RegExp.$1; //25
RegExp.$2; //10
RegExp.$3; //2009
now.replace(/(\d\d)\/(\d\d)\/(\d\d\d\d)/,"$3-$2-$1"); //2009-10-25
now.replace(/(\d{2})\/(\d{2})\/(\d{4})/,"$3-$2-$1"); //2009-10-25
正则前瞻 vs. 非捕获性分组
正则前瞻(?=)会作为匹配校验,但不会出现在匹配结果字符串里面
非捕获性分组(?:)会作为匹配校验,并出现在匹配结果字符里面,它跟(...)不同的地方在于,不作为子匹配返回。
例如:
var data = 'windows 98 is ok';
data.match(/windows (?=\d+)/); // ["windows "]
data.match(/windows (?:\d+)/); // ["windows 98"]
data.match(/windows (\d+)/); // ["windows 98", "98"]
非捕获性分组定义子表达式可以作为整体被修饰但是子表达式匹配结果不会被存储。
非捕获性分组通过将子表达式放在"?:"符号后。
var str_img = "img1.jpg,img2.jpg,img3.bmp";
var reg = /(?:\w*)(?=\.jpg)/g;
var arr_m = str_img.match(reg);//arr_m = [ 'img1', '', 'img2', '' ]
var reg2 = /(?:\w*)(?:\.jpg)/g;
var arr_m2=str_img.match(reg2); //arr_m2=[ 'img1.jpg', 'img2.jpg' ]