前言
同事吐槽后端给的数据超乎想象,需要自己处理字符串,正常写的话有点麻烦。是时候祭出正则了!
需求
转换字符串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
以上!