正则表达式之分组捕获

前言

同事吐槽后端给的数据超乎想象,需要自己处理字符串,正常写的话有点麻烦。是时候祭出正则了!

需求

转换字符串1-5|08:00:00-18:00:00周一至周五 08:00-18:00

操作

介绍

普通的正则匹配这里不再赘述。正则有个实用的玩意叫分组捕获,其实就是拿()把正则表达式一包,就摇身一变,成了组了。有人就有江湖,有组就会有组号,组号是自动分配的,可以通过组号引用该分组(这个很重要)。

编写

我们需要将原始字符串分成4组,分别匹配1,5,08:00和18:00这样就可以获取我们想要的数据了。数字很好匹配就是 \d,特殊字符比如-|,使用.来匹配,时间的话,偷懒一点用\d了,最后完成的分组写法如下:

/(\d).(\d).([\d]{2}:[\d]{2})(?:.[\d]{2}).([\d]{2}:[\d]{2})(?:.[\d]{2})/gi

看起来被()包裹的不只四组,其实有两组的开头是?:意思就是不参与捕获,也就是不会分配组号

引用

默认的组号是从1开始的,在JS中 通过 $1,$2…来引用分组匹配到的内容:

    const str = "1-5|08:00:00-18:00:00";
    const reg = /(\d).(\d).([\d]{2}:[\d]{2})(?:.[\d]{2}).([\d]{2}:[\d]{2})(?:.[\d]{2})/gi;
    const result = str.replace(reg, "周$1至周$2 $3-$4");
    console.log(result);  // 周1至周5 08:00-18:00

进一步处理,替换1 和 5为对应的星期。replace的第二个参数可以是函数,而在函数中引用正则匹配结果需要另一种方式,类似 RegExp.$1

	const str = "1-5|08:00:00-18:00:00";
    const reg = /(\d).(\d).([\d]{2}:[\d]{2})(?:.[\d]{2}).([\d]{2}:[\d]{2})(?:.[\d]{2})/gi;
    const weekList = ["日", "一", "二", "三", "四", "五", "六"];
    const res = str.replace(reg, () => {
      return `${weekList[RegExp.$1]}至周${weekList[RegExp.$2]} ${RegExp.$3}-${
        RegExp.$4
      }`;
    });
    console.log(res); // 周一至周五 08:00-18:00

以上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值