说我有以下字符串:
let code = `
var x = 4;
var y=9,
w=8
var z=8080
other()
x=12
`
我如何编写一个获取所有变量声明的正则表达式?在这种情况下,我想返回所有语句,但不返回任何表达式,因此请排除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)
,但它也返回x = 12,这是我不想要的。 即使在其前面有逗号(在前一行或上一个字符,通常允许变量声明的任何东西之前,我也需要返回所有语句块)。
您知道如何使用正则表达式吗?
编辑:
使用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值似乎有点矫kill过正? (我不需要评估它,只需像这样获取字符串值)
请参见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