js|正则表达式捕获分组

上一篇文章写过正则表达式精讲,这篇主要分析一下里面说到的捕获分组。
捕获分组一般跟exec、match、replace配合使用场景比较多;
正则表达式最后一个全局变量常用的就是g、i。g是全局搜索,i是不区分大小写,gi一起使用则是不区分大小写全局搜索匹配;
上述虽然不属于捕获,但是跟捕获有很大的关系。
捕获分组:
所谓捕获 在正则体现出来是用一个个的()包含的内容,例如:/a(bc(def))/g,这个正则如果exec('abcdefgh'),则会返回三个分组[abcdef.bcdef,def],
其中第一个值是匹配内容,后面的两项才是捕获的内容,并且由左到右进行分组。
而如果改为用match进行分组,则不会捕获到子分组:即如下'abcdefg'.match(/a(bc(def))/g),这样只会返回匹配主内容,不会返回子匹配[abcdef]。
究其原因就是正则中最后一个值(全局搜索变量g),这个全局搜索变量的设定使得不会去捕获分组内容。如果非得用match你可以将最后的g去掉或者用i替换即'abcdefg'.match(/a(bc(def))/)
这就是捕获,实现捕获后我们才可以根据捕获内容进行分组。js没有其他语言那样可以根据自定义分组名进行分组,但是提供了默认的$num来按序进行分组,
即如上匹配结果[abcdef,bcdef,def]其中每项对应的分组名为$1,$2,$3.每个分组名都代表匹配的内容,例如:$1==abcdef.
当然我们也可以根据需要手动进行分组。例如去除重复字符串:

var a="abbcccdddeeeffghh";
var b=a.replace(/(.)\1+/g,"$1");
这里就是将重复第一个匹配的字符列为分组1即:‘bb’'ccc''dd''eee''ff''hh'中的bcdefh替换重复的字符串。
最后我们举个例子获取url参数值:
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "g");
var r =reg .exec(window.location.search.substr(1));
if (r != null) return unescape(r[2]); return null;
}

例如url为www.baidu.com?a=111&b=22&c=3;
首先正则表达式为/(^\&)name=([^&])(&|$)/g,这个正则表达式exec后捕获到四个分组第一个分组就是匹配的所有内容。
比如getQueryString('b'),返回的捕获数组为['&b=22&','&','22','&']其中第三组也就是([^&])匹配的内容是我们想要的,于是r[2]就是22.
【js|正则表达式捕获分组】

    推荐阅读