正则表达式从字符串中获取所有 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
假设我有以下字符串:
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