今天遇到一个问题,就是在使用mock模拟本地api请求的时候,因为做了一个全局配置文件,配置文件里面有一个devUrl属性,这个属性是本地的url地址,所以我就想着,让mock那边自动将devUrl和api地址进行拼接。

但是api地址段不一定只是字符,有可能是正则。

所以,我们需要进行拼接正则。

知识点

1.如何获取正则的匹配的那段文本?

也就是/[a-z]/ig中我们怎么拿到[a-z],因为这个内容是自定义的,你不知道他会是什么内容。

这里我们就需要了解到reg对象的source属性:

RegExpObject.source

source就可以直接返回给我们模式匹配所用的文本

/[a-z]/ig.source;  //"[a-z]"

2.如何获取正则的匹配模式修饰符

这问题es5的话,就很头疼了,你需要考虑到所有的修饰符,然后去判断:

/[a-z]/ig.global   //true   是否设置了 "g" 修饰符
/[a-z]/ig.ignoreCase   //true   是否设置了 "i" 修饰符
/[a-z]/ig.multiline    //true   是否设置了 "m" 修饰符

然后我们需要一个个if判断,然后添加,多头疼。

好在es6提供了一个新的方法,可以一口气拿到所有的修饰符:flags

有兴趣可以看看我这篇es6正则
/[a-z]/ig.flags   //"gi"

3.如何进行拼接

我们可以使用new RegExp()的方式创建一个新的正则对象。

let a = /[a-z]/ig;
new RegExp(a.source+'[A-Z]',a.flags);   // /[a-z][A-Z]/ig

在new出这个新的正则对象时,我们是可以对内容进行拼接的。

方法

let a = /[a-z]/ig;
let b = /[A-Z]/im;

let c = new RegExp(a.source + b.source,modMerge(a.flags,b.flags));

console.log(c);  // /[a-z][A-Z]/gim

//修饰符合并去重
function modMerge(a,b) {
  let modifier = [];
  //合并
  modifier.push(...a.split(""));
  modifier.push(...b.split(""));
  //去重
  modifier =  Array.from(new Set(modifier)).join("");
  return modifier;
}

这样就可以了,如果你有多个正则需要合并,自己做个for循环就行了,原理就是这样。

分类: JavaScript 标签: 正则拼接正则修饰符模式匹配

评论

暂无评论数据

暂无评论数据

目录