【问题标题】:Parsing JavaScript code in Java to retrieve variables' names在 Java 中解析 JavaScript 代码以检索变量的名称
【发布时间】:2011-11-16 11:34:01
【问题描述】:

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

所以,对于下面的 javasctipt:

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

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

我不需要获取它们的值,只需获取它们的名称。

【问题讨论】:

  • 你的意思是喜欢在java中读取包含javasscript的文件吗?
  • 我想你的问题在stackoverflow.com/questions/2051678/…得到了回答
  • 那么,你有一个包含 javascript 代码的 Java String 变量,你需要提取所有 javascript vars 的名称吗?

标签: java javascript string parsing


【解决方案1】:

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

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]

【讨论】:

    【解决方案2】:

    类似于以下内容:

    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 的情况下编写了这段代码,并且从未编译和运行过它。因此,对于可能的错误,我深表歉意,但我认为它具有足够的可读性,并且可以成为您的一个很好的起点。

    【讨论】:

      【解决方案3】:

      我不确定这是否过于复杂,但我可能会获得 Javascript 的 BNF(请参阅 SO: Repository of BNF Grammars?),然后使用类似 ANTLR 的东西为 Javascript 创建解析器,然后您可以使用它根据 Javascript 源代码提取所有变量。另见SO: ANTLR Tutorials

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 2014-07-13
        • 1970-01-01
        • 2012-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多