上一篇文章写过正则表达式精讲,这篇主要分析一下里面说到的捕获分组。
捕获分组一般跟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|正则表达式捕获分组】
推荐阅读
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- 前端|web前端dya07--ES6高级语法的转化&render&vue与webpack&export
- JS/JavaScript|JS/JavaScript CRC8多项式 16进制
- JS|VUE学习笔记[30-46]
- 腾讯TEG实习|腾讯实习——Vue解决跨域请求
- 地图|高德地图清除指定覆盖物 自定义覆盖物样式(完整dome)
- Pyecharts|Pyecharts 猎聘招聘数据可视化
- flex|C语言-使用goto语句从循环中跳出