为何.replace方法在.map函数中无法正常工作?
问题分析与解决
这个问题我之前踩过同款坑,核心误区是你在map函数里把正则表达式写成了字符串形式,而不是正确的正则字面量或者RegExp对象,导致替换逻辑根本没按正则规则执行~
为什么map里的替换无效?
你在map里写的是:
item.replace('/\\\\(?:[a-z])/g','');
这里的第一个参数是字符串'/\\\\(?:[a-z])/g',JavaScript会把它当作普通文本去匹配——也就是说它只会找原字符串里有没有字面量的/\\(?:[a-z])/g这段内容,显然你的数组元素里根本没有这个,所以替换完全没效果。
为什么你觉得直接访问元素时有效?
推测你可能实际测试时写错了参数,比如把直接调用的参数改成了正则字面量。如果真的用和map里一样的字符串参数,直接访问时也不会生效;但如果是用正则字面量/\\[a-z]/g,那确实会生效,因为这时候JavaScript会把它解析成正则规则,而不是普通文本。
正确的写法
有两种方式可以修正:
方式1:使用正则字面量(推荐)
直接写不带引号的正则字面量,注意正则里的反斜杠需要转义一次(\\表示实际的\):
var entry = [ '\\n000087', '1', '000055555', 'admin', '1', '0', '2018/07/06', '08:53:14\\t' ]; entry = entry.map((item)=>{ return item.replace(/\\[a-z]/g,''); }); console.log(entry); // 输出 ["000087", "1", "000055555", "admin", "1", "0", "2018/07/06", "08:53:14"]
方式2:使用RegExp构造函数
如果需要用字符串形式定义正则,要去掉前后的/,并且反斜杠需要额外转义一次(因为字符串里的\\才对应正则里的\),然后通过RegExp构造函数创建对象:
var entry = [ '\\n000087', '1', '000055555', 'admin', '1', '0', '2018/07/06', '08:53:14\\t' ]; entry = entry.map((item)=>{ return item.replace(new RegExp('\\\\[a-z]', 'g'),''); }); console.log(entry); // 同样得到正确结果
额外小优化
你的正则里用了非捕获组(?:[a-z]),其实完全没必要,直接写\\[a-z]就足够匹配“反斜杠+小写字母”的组合了,简化后更易读。
内容的提问来源于stack exchange,提问作者NoleloN
相关产品推荐
相关产品推荐

