使用 Nashorn 匹配 Javascript 正则表达式

Matching Javascript RegEx using Nashorn

如何使用符合 ECMA 262 的正则表达式评估输入?
阅读之后,我发现 Java 8 的 javascript 引擎 nashorn 可以帮助我做到这一点。
如何使用 nashorn 脚本引擎来匹配正则表达式?

也许是这样的:

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 才能获得 "nashorn" 引擎。 se.eval(String) 的参数是 javascript。对于这个例子,我保持简单。您可以根据正则表达式做很多其他事情。参见 here

使用 Java 8,您可以使用 nashorn 标识符通过包 javax.script 使用 Nashorn Java脚本引擎。

这是一个例子:

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

您需要熟悉 ScriptEngine class 并且需要进行相当多的测试和试错以处理自返回数据以来返回的数据不会是类型安全的。在这个过程中,调试器将是你最好的朋友。

假设您有一个文件 regex.js 包含用于确定给定字符串是否与给定正则表达式匹配的方法:

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

您可以使用 Nashorn 脚本引擎评估此函数,并使用以下代码调用它:

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. This interface is implemented by the NashornScriptEngine and defines a method invokeFunction 才能调用给定名称的 JavaScript 函数。然后将其余方法参数直接作为参数传递给 JavaScript 方法。

请注意,也可以在没有外部 Java脚本文件的情况下执行此操作。也可以通过要求脚本引擎评估字符串来避免强制转换为 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 时,您必须非常注意字符的正确转义:两种语言的规则不同。