如何使用JavaScript正则表达式提取let声明语句中的变量名
JS提取let声明中的所有变量名方案
问题原因
你原来的正则存在两个核心问题:
- 正则中的
.*是贪婪匹配,从第一个变量的赋值符号=之后,会直接匹配到整行末尾,把后面两个变量的内容全部吞掉,自然无法捕获后续变量 - 没有加全局匹配标识
g,即使正则逻辑正确也只会返回第一个匹配结果
实现方案
方案1:两步处理(兼容性最优)
不需要用到高级正则特性,所有JS运行环境都支持:
const str = `let URL="https://www.lipsum.com/", error, pass=true;`; // 第一步提取let到结尾分号之间的声明内容 const declarePart = str.match(/let\s+(.*?);/)[1]; // 第二步匹配所有变量名,自动跳过赋值内容 const variableNames = declarePart.match(/[\w_$]+(?=\s*(?:=|,|$))/g); console.log(variableNames); // 输出:['URL', 'error', 'pass']
方案2:单条正则实现
需要ES2018及以上支持后行断言的环境使用:
const str = `let URL="https://www.lipsum.com/", error, pass=true;`; const regex = /(?<=\blet\s+(?:.*?,)?\s*)[\w_$]+(?=\s*(?:=|,|;))/g; const variableNames = str.match(regex); console.log(variableNames); // 输出:['URL', 'error', 'pass']
核心逻辑说明
- 全局标识
g会让正则匹配所有符合规则的结果,而不是仅返回第一个匹配项 - 正向断言
(?=)用来限定变量名的后缀只能是等号、逗号、行尾,不会把断言内的内容计入匹配结果 - 非贪婪匹配
.*?避免一次性吞掉所有后续内容
内容的提问来源于stack exchange,提问作者Shantanu Kaushik
相关产品推荐
相关产品推荐

