1

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 が私のためにそれを行うのであれば、そのアプローチのすべての固有のリスクで変数関数を解析して解決しようとするよりも、それを好むでしょう。

EDIT これを適切に行う方法がないように思われるため、正規表現を使用して2つのチェックを作成しました。

    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 "";
    }
4

1 に答える 1

0

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 "";
}
于 2012-09-21T06:09:30.163 に答える