如何評估ECMA 262兼容正則表達式的輸入?
經過一番閱讀後,我發現Java 8的JavaScript引擎nashorn
可以幫助我做到這一點。
如何使用nashorn腳本引擎來匹配正則表達式?匹配Javascript正則表達式使用Nashorn
回答
假設你有一個文件,其中包含用於確定給定的字符串給定的正則表達式匹配的方法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中,你必須非常小心正確的字符轉義:規則是不是這兩種語言相同。
第二種選擇將適用於我的情況我明天早上將嘗試第一件事。 –
也許是這樣的:
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。
使用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類,你需要做相當多的測試和試驗的&錯誤處理返回的數據,因爲返回的數據不是類型安全的。在此過程中,調試器將成爲您最好的朋友。
考慮到這與其他答案几乎相同,都是在同一時間提交的...什麼是downvote? – JNYRanger
- 1. 使用正則表達式的Javascript正則表達式匹配
- 2. 正則表達式匹配使用JavaScript
- 3. JavaScript匹配使用正則表達式
- 4. 正則表達式匹配用JavaScript
- 5. Javascript正則表達式匹配正則表達式
- 6. Javascript的正則表達式匹配*/
- 7. Javascript正則表達式匹配句子
- 8. javascript中的正則表達式匹配
- 9. JavaScript正則表達式匹配量
- 10. JavaScript的正則表達式匹配
- 11. Javascript參考正則表達式匹配
- 12. 匹配正則表達式中的JavaScript
- 13. Javascript正則表達式匹配組
- 14. 正則表達式匹配javascript
- 15. 正則表達式匹配 - 的JavaScript
- 16. JavaScript正則表達式元素匹配
- 17. JavaScript正則表達式匹配
- 18. Javascript正則表達式字符匹配
- 19. Javascript正則表達式匹配
- 20. JavaScript的UTC匹配正則表達式
- 21. JavaScript的正則表達式匹配ASCII
- 22. 匹配正則表達式href = javascript
- 23. 正則表達式(匹配函數),javascript
- 24. Javascript正則表達式多個匹配
- 25. JavaScript正則表達式 - 匹配除
- 26. Javascript正則表達式匹配
- 27. JavaScript正則表達式匹配
- 28. JavaScript正則表達式和子匹配
- 29. javascript正則表達式匹配{0}
- 30. Javascript正則表達式匹配()
我對你的問題有點困惑。您正在問如何通過Java 8中的Nashorn JS引擎使用ECMAScript正則表達式?是否有任何理由不使用Java的正則表達式?這是在做什麼(服務器/客戶端)? – JNYRanger
@JNYRanger對於你的第一個問題 - 是的。這就是我要問的。 Nashorn建立在ECMA規範之上,所以不應該有任何麻煩。
由於Javascript RegEx與Java RegEx不同。 –
我知道JavaScript正則表達式在語法上是不同的,但我的問題是關於爲什麼要使用JavaScript正則表達式而不是Java正則表達式,因爲兩種語言的RegEx引擎都提供相同的功能集。你從哪裏得到這個模式?您可能想考慮執行Java和JavaScript正則表達式語法之間的轉換,這將更容易做到:http://stackoverflow.com/a/8754472/2359643 – JNYRanger