用Java解析JavaScript代码以检索变量'的名字

Parsing JavaScript code in Java to retrieve variables' names

本文关键字:变量 检索 解析 Java JavaScript 代码      更新时间:2023-09-26

我有一个包含javascript代码的Java String,我需要提取所有javascript var的名称。

那么,对于下面的javascript:

var x;
var a,b,c,d;
var y = "wow";
var z = y + 'x';

我需要得到"x,a,b,c,d,y,z"作为结果。

我不需要得到它们的值,只需要得到它们的名字

你可以尝试获取脚本执行时创建的绑定:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine se = mgr.getEngineByName("JavaScript");
try {
    se.eval("var x;var a,b,c,d;var y = '"wow'";var z = y+'x';");
    Bindings bindings = se.getBindings(ScriptContext.ENGINE_SCOPE);
    System.out.println(bindings.keySet());
}
catch (ScriptException e) {
    //e.printStackTrace();
}

打印[d, b, c, println, a, context, z, y, print, x]

定义了一些额外的绑定:context, print and println

这里我们把它们过滤掉

Set<String> keySet = bindings.keySet();
keySet.removeAll(Arrays.asList("context", "print", "println"));
System.out.println(keySet);

打印[d, b, c, a, z, y, x]

类似如下:

List<String> vars = new ArrayList<String>();
Pattern p = Pattern.compile("^''s*var''s+(.*?)''s*;?$");
BifferedReader reader = .... // create the reader
String line = null;
while ((line = reader.readLine()) != null) {
    Matcher m = p.matcher(line);
    if (m.find()) {
        vars.addAll(Arrays.asList(m.group(1).split("''s*,''s*")));       
    }
}

请注意,我在没有IDE的情况下编写了这段代码,并且从未编译和运行过它。所以,抱歉可能的错误,但我认为它是可读的,可以为您提供一个很好的起点。

我不确定这是否会太复杂,但我可能会得到Javascript的BNF(参见SO: BNF语法库?),然后使用类似ANTLR的东西创建Javascript解析器,然后可以使用它来提取基于Javascript源代码的所有变量。参见SO: ANTLR教程