正则表达式从字符串中获取所有 JavaScript 变量名称和值

regex to get all JavaScript variable names and values from string

假设我有以下字符串:

let code = `
      var x = 4;
      var y=9,
          w=8
      var z=8080
      other()
      x=12

`

如何编写获取所有变量声明的正则表达式?在这种情况下,我想要 return 所有语句,而不是表达式,因此排除 other()x=12 部分。到目前为止我有

let results = `
      var x = 4;
      var y=9,
          w=8
      var z=8080
      other()
      x=12
      
    `.match(/(var)(.*?)(;|,|\n)/g);
    
console.log(results);

但我不知道如何也包含 w=8 部分,因为这也是一个声明语句,同时排除了表达式。我尝试了 .match(/(var|\n)(.*?)(;|,|\n)/g),但也尝试了 returns x=12,这是我不想要的。 我还需要 return 所有语句块,即使它前面有一个逗号(在前一行或前一个字符上,通常允许变量声明的任何内容)。

知道如何使用正则表达式做到这一点吗?

编辑:

使用 uglifyjs 我可以执行以下操作(这是我想要的结果):

let strin = `
      var x = 4;
      var y=9,
          w=8,
          kk = {
              ok:1234
          },
    p,
    a = undefined
      var z=8080
      other()
      x=12
     
    `
let results = UglifyJS.parse(strin).body.filter(x=>x.__proto__.TYPE == "Var")
.map(x=>
     x.definitions.map(y=>({
        name:y.name.name,
        value:y.value ? findInPos(y.value.start, y.value.end,strin) : undefined
     })),
    
).flat()
function findInPos(start, end,str) {
    return str.substring(
        start.pos,
        end.endpos
    );
}
<script type="text/javascript" src="https://yaakovyitzchak.github.io/coby/uglify.js">
</script>

但是仅仅提取每个变量的string值似乎有点大材小用? (不需要求值,直接获取字符串值即可)

使用 TypeScript 编译器 API 可以很好地解决该任务,因为它不仅可以解析 TypeScript,还可以解析 JavaScript 代码。由于 TypeScript 编译成 JavaScript - 将以下 TS 片段集成到 JS 项目中应该没有问题。

demo

import ts from "typescript";

const code = `
    var x = 4;
    var y=9,
        w=8
    var z=8080
    other()
    x=12
`;

const sf = ts.createSourceFile(
    "test.js",
    code,
    ts.ScriptTarget.ES2017,
    true,
    ts.ScriptKind.JS,
);

sf.forEachChild((n) => {
    if (ts.isVariableStatement(n)) {
        n.declarationList.declarations.forEach((decl) => {
            const name = decl.name.getText();
            const value = decl.initializer?.getText();
            console.log(`${name} = ${value}`);
        });
    }
});

上面的代码将以下输出打印到控制台:

x = 4
y = 9
w = 8
z = 8080