xuanzizhe
2021-07-14 15:28:21 +08:00
如果是想判断正则表达式字面量是不是个合规的正则表达式,可以简单的验证一下:
```javascript
const isRegExp = (rule) => {
if(/^\/.+?\/[imdsguy]*$/.test(rule)){
try{
return new Function('', `var __rule__ = ${rule}; return __rule__ instanceof RegExp;`)();
}catch(_e){
return false;
}
}
return false;
};
console.log(isRegExp('/a/b')); // false
console.log(isRegExp('/a/i')); // true
console.log(isRegExp('/a/ii')); // false
console.log(isRegExp('/[a-z]/i')); // true
console.log(isRegExp('/[z-a]/i')); // false
```
正常的逻辑判断基本够用了,但上面的还是阻止不了一些特意规避的写法,比如像下面这样写:
```javascript
console.log(isRegExp('/a/;/b/')); // true, 考虑到斜杠 /在字符 sets([/])里是不需要转义的,所以也不能简单的判断 /是否前面有反斜杠\
```
要想完整的判断只能解析正则表达式的语法,但语法层面你还得考虑到浏览器对正则表达式的支持程度,比如是否要支持命名分组、\p unicode category 、负向前瞻等等,要做到完善还是需要考虑很多细节的。