Chrome可用的JS正则在Node中报Invalid group错误求助
为什么Node.js里我的正则表达式报错但Chrome里正常?
这个问题我之前也碰到过,核心原因是正则里的正向预查(positive lookbehind)语法在不同环境的支持差异:
你写的(?<=__\()属于ES2018引入的正向预查特性,Chrome的V8引擎很早就跟进支持了这个特性,所以在浏览器里能正常运行;但Node.js的版本如果比较旧(比如10.x及以下),默认是不支持ES2018的lookbehind的,所以解析正则时会抛出Invalid group的语法错误。
解决方法有两种,你可以根据情况选:
1. 升级Node.js版本
如果可以的话,直接把Node.js升到12.x及以上版本——从Node.js 12开始,V8引擎已经默认支持ES2018的所有正则特性,包括正向预查,这样你的原正则代码不用改就能正常运行。
2. 修改正则,避开lookbehind语法
如果暂时没法升级Node版本,完全可以换一种写法实现需求,不用依赖lookbehind。比如利用捕获组来提取内容:
const file = "__('string to be extracted');"; const regex = /__\((.*?)\)/g; const strings = []; let match; // 通过循环exec获取所有匹配的捕获组 while ((match = regex.exec(file)) !== null) { strings.push(match[1]); } console.log(strings); // 输出 ["'string to be extracted'"]
要是还想直接去掉字符串两端的引号,可以把正则再细化一点:
const regex = /__\(['"](.*?)['"]\)/g; // 此时strings会输出 ["string to be extracted"]
额外说明
如果非要坚持用原正则的lookbehind写法,也可以在运行Node时加上--harmony参数(比如node --harmony your-file.js),但这个参数是实验性的,稳定性不如直接升级版本,所以不太推荐。
内容的提问来源于stack exchange,提问作者Asleepace
相关产品推荐
相关产品推荐

