正则表达式捕获分组

上一篇文章写过正则表达式精讲,这篇主要分析一下里面说到的捕获分组。

捕获分组一般跟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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值