基于标点数组用RegExp构造函数创建正则的转义问题
解决正则构造函数中转义特殊字符的问题
我明白你遇到的麻烦了——当用RegExp构造函数处理?、+这类正则元字符时,直接使用会触发语法错误,普通的转义方式(比如单反斜杠或者escape())又完全不管用。这其实是JS字符串转义规则和正则转义规则叠加导致的,我来给你捋清楚怎么解决:
首先说为啥直接加反斜杠不行:在JS字符串里,\本身是转义字符,如果你写new RegExp('\?', 'g'),JS会把\?解析成单个?(因为\?不是有效的字符串转义序列,反斜杠会被忽略),正则引擎拿到的还是未转义的?,自然会报错。正确的写法是在字符串里写两个反斜杠,也就是'\\?',这样JS解析后会给正则引擎传递\?,才能正确转义问号。
但手动给每个字符加双反斜杠太麻烦,万一数组里新增其他元字符(比如*、^、()还要逐个处理,不如写一个通用的转义函数:
function escapeRegExp(char) { // 匹配所有正则元字符并统一转义 return char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }
这个函数的原理是用正则匹配所有正则语法里的特殊字符,然后用\\$&替换——$&代表匹配到的原字符,前面加两个反斜杠是为了让JS字符串最终输出一个反斜杠给正则引擎。
接下来把这个函数用到你的代码里就可以了:
const punctuation = ['?', '.', '+']; _.each(punctuation, (character) => { const escapedChar = escapeRegExp(character); const regex = new RegExp(escapedChar, 'g'); // 这里执行你的操作,比如: // const result = someString.replace(regex, '替换后的内容'); console.log(regex); // 现在输出的正则是正确转义后的版本了 });
另外要提醒你,escape()函数完全不适合做这件事——它是用来编码URL特殊字符的,比如escape('?')会得到'%3F',这显然不是正则需要的转义结果,所以别再用它啦。
试一下这个方案,应该就能解决你的报错问题了!
内容的提问来源于stack exchange,提问作者LT86
相关产品推荐
相关产品推荐

