2015-09-14 35 views
1

如何評估ECMA 262兼容正則表達式的輸入?
經過一番閱讀後,我發現Java 8的JavaScript引擎nashorn可以幫助我做到這一點。
如何使用nashorn腳本引擎來匹配正則表達式?匹配Javascript正則表達式使用Nashorn

+0

我對你的問題有點困惑。您正在問如何通過Java 8中的Nashorn JS引擎使用ECMAScript正則表達式?是否有任何理由不使用Java的正則表達式?這是在做什麼(服務器/客戶端)? – JNYRanger

+0

@JNYRanger對於你的第一個問題 - 是的。這就是我要問的。 Nashorn建立在ECMA規範之上,所以不應該有任何麻煩。
由於Javascript RegEx與Java RegEx不同。 –

+0

我知道JavaScript正則表達式在語法上是不同的,但我的問題是關於爲什麼要使用JavaScript正則表達式而不是Java正則表達式,因爲兩種語言的RegEx引擎都提供相同的功能集。你從哪裏得到這個模式?您可能想考慮執行Java和JavaScript正則表達式語法之間的轉換,這將更容易做到:http://stackoverflow.com/a/8754472/2359643 – JNYRanger

回答

4

假設你有一個文件,其中包含用於確定給定的字符串給定的正則表達式匹配的方法regex.js

var check = function(regex, str) { 
    return new RegExp(regex).test(str); 
}; 

您可以使用犀牛腳本引擎評估此功能,並具有以下稱之爲代碼:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
engine.eval(new FileReader("regex.js")); 
Invocable invocable = (Invocable) engine; 
Object result = invocable.invokeFunction("check", "\\d+", "1"); 
System.out.println(result); 

爲了調用一個函數,你首先要投腳本引擎Invocable。該接口由NashornScriptEngine實現,並定義一個方法invokeFunction來爲給定名稱調用JavaScript函數。其餘的方法參數然後直接作爲參數傳遞給JavaScript方法。

請注意,也可以在沒有外部JavaScript文件的情況下執行此操作。也可以通過讓腳本引擎評估字符串來避免轉換爲Invocable。這是相同的代碼與這兩個思路:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
engine.eval("function check(regex, str) { return new RegExp(regex).test(str); }"); 
Object result = engine.eval("check('\\\\d+', 1);"); 
System.out.println(result);  

當傳遞變量從Java到JavaScript中,你必須非常小心正確的字符轉義:規則是不是這兩種語言相同。

+0

第二種選擇將適用於我的情況我明天早上將嘗試第一件事。 –

1

也許是這樣的:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine se = manager.getEngineByName("nashorn"); 
se.put("str", "the quick brown fox"); 
se.put("rgx", "/quick/"); 
Object result = se.eval("str.matches(rgx).length"); 
System.out.println(result); 

您需要與Java8運行,以獲得「犀牛」的發動機。 se.eval(String)的參數是javascript。這個例子我保持簡單。你可以用正則表達式來做很多其他的事情。見here

-1

使用Java 8,您可以通過使用nashorn標識符的包javax.script使用Nashorn JavaScript引擎。

下面是一個例子:

ScriptEngineManager engineManager = new ScriptEngineManager(); 
ScriptEngine nashorn = engineManager.getEngineByName("nashorn"); 

String ecmaScript = //YOUR SCRIPT HERE 
//add any additional variables here 
Object returnVal = nashorn.eval(ecmaScript); 

來源:http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

你想獲得familar與ScriptEngine類,你需要做相當多的測試和試驗的&錯誤處理返回的數據,因爲返回的數據不是類型安全的。在此過程中,調試器將成爲您最好的朋友。

+0

考慮到這與其他答案几乎相同,都是在同一時間提交的...什麼是downvote? – JNYRanger