【问题标题】:Can ScriptEngineManager give me the name of the Javascript function it has just compiled in JavaScriptEngineManager 可以给我它刚刚用 Java 编译的 Javascript 函数的名称吗
【发布时间】:2012-08-30 20:17:29
【问题描述】:

如何找出用 Java 解析的 javascript 函数的名称。 我允许用户输入一个 Javascript 函数(在 JTextArea 中),然后我使用 ScriptEngineManager 来确认它是有效的语法,如下所示:

public final boolean isFunctionValid(String function)
{
    try
    {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        Object result = engine.eval(function);
    }
    catch(ScriptException se)
    {
        return false;
    }
    return true;
}

工作正常,但我也想知道函数的名称,以便我可以为函数分配一个与函数名称匹配的名称。如果 ScriptEngineManager 为我做这件事,我更喜欢它,而不是我试图通过解析变量函数来解决它,因为这种方法的固有风险

编辑 由于似乎无法正确执行此操作,因此我使用适合我的正则表达式创建了两个检查。

    protected static Pattern functionNameMatch;
    protected static Pattern multipleFunctionsMatch;
    static
    {
        functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*)[ ]*\\(");
        multipleFunctionsMatch = Pattern.compile("function[ ]+");
    }


    protected boolean isOneFunction()
    {
        Matcher m = multipleFunctionsMatch.matcher(function.getText());
        if(m.find())
        {
            if(m.find())
            {
                return false;
            }
            return true;
        }
        return false;
    }

    protected String deriveNameFromFunction()
    {
        Matcher m = functionNameMatch.matcher(function.getText());
        if(m.find())
        {
            return m.group(1);
        }
        return "";
    }

【问题讨论】:

  • 嗯,你真的无法知道被解析的文本是否甚至是一个函数。任何有效的 JavaScript 语句都会通过该测试。我很确定答案是否定的。
  • 嗯,是的,在发布后确实发生了它只是检查它是有效的 Javascript 语法而不是 JavaScript 函数,但肯定必须有一种强大的方法来做这两者(检查它的 javascripit 函数,及其名称)
  • JavaScript 足够灵活,没有办法做到这一点,除非使用 Rhino 来提供这种统计数据。 JavaScript 函数甚至不必个名字。
  • 好的。不是我最初希望的答案,但没什么大不了的。

标签: java javascript javascript-engine


【解决方案1】:

由于在 JavaScript 中不可能,所以我使用模式匹配进行了一些额外的检查

protected static Pattern functionNameMatch;
protected static Pattern multipleFunctionsMatch;
static
{
    //TODO this method only works if all parameters are put on first line of function, otherwise declares function
    //is invalid
    functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*[ ]*\\(.*\\))");
    multipleFunctionsMatch = Pattern.compile("function[ ]+");
}

protected boolean isOneFunction()
{
    Matcher m = multipleFunctionsMatch.matcher(function.getText());
    if(m.find())
    {
        if(m.find())
        {
            return false;
        }
        return true;
    }
    return false;
}

protected String deriveNameFromFunction()
{
    Matcher m = functionNameMatch.matcher(function.getText());
    if(m.find())
    {
        return m.group(1);
    }
    return "";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多