2012-08-30 48 views
1

如何找到在Java中分析的javascript函數的名稱。 我允許用戶在鍵入一個JavaScript函數(在JTextArea),然後我用ScriptEngineManager以確認它是有效的語法如下:ScriptEngineManager可以給我它剛剛在Java中編譯的Javascript函數的名稱

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 ""; 
    } 
+0

那麼你真的沒有辦法知道這是分析的文本是否真能功能,在所有。任何有效的JavaScript語句都會成功通過該測試。我很肯定答案是「不」。 – Pointy

+0

嗯,是的確發生過後發佈,它只是檢查它是有效的JavaScript語法而不是Javscript函數,但肯定必須有一個強大的方法來做到這兩個(檢查它的javascripit函數,它的名字) –

+0

JavaScript是足夠靈活以至於沒有辦法做到這一點,因爲沒有讓Rhino提供這種統計數據。 JavaScript函數甚至不必擁有*名稱。 – Pointy

回答

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 ""; 
} 
相關問題