【问题标题】:Matching Javascript RegEx using Nashorn使用 Nashorn 匹配 Javascript RegEx
【发布时间】:2015-12-10 20:15:58
【问题描述】:

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

【问题讨论】:

  • 我对你的问题有点困惑。您在问如何通过 Java 8 中的 Nashorn JS 引擎使用处理 ECMAScript 正则表达式?你有什么理由不只使用 Java 的正则表达式吗?这是在哪里完成的(服务器/客户端)?
  • @JNYRanger 对于您的第一个问题 - 是的。这就是我要问的。 Nashorn 是基于 ECMA 规范构建的,所以这样做应该不会有任何问题。
    因为 Javascript RegEx 与 Java RegEx 不同。
  • 我知道 JavaScript 正则表达式在语法上是不同的,但我的问题是关于为什么要使用 JavaScript 正则表达式而不是 Java 正则表达式,因为这两种语言的正则表达式引擎都提供相同的功能集。你从哪里得到模式?您可能想要考虑在 Java 和 JavaScript 正则表达式语法之间执行转换,这会更容易做到:stackoverflow.com/a/8754472/2359643
  • @JNYRanger 我正在使用 swagger 编写验证框架。 Swagger 基于 yaml。 Yaml 是 Json Schema 的超级集,允许 ECMA 标准上的正则表达式。希望这足够清楚。
  • 现在很有意义!

标签: java regex java-8 ecmascript-5 nashorn


【解决方案1】:

假设您有一个文件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。此接口由 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 时,您必须非常小心字符的正确转义:两种语言的规则不同。

【讨论】:

  • 第二个选项适用于我的情况,我将在明天早上尝试第一件事。
【解决方案2】:

大概是这样的:

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

【讨论】:

    【解决方案3】:

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

    这是一个例子:

    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 类,并且需要进行大量测试和反复试验来处理返回的数据,因为返回的数据不是类型安全的。在此过程中,调试器将成为您最好的朋友。

    【讨论】:

    • 考虑到这实际上与这里的其他回复几乎是在同一时间提交的......反对意见是什么?
    猜你喜欢
    • 2010-09-10
    • 2012-02-22
    • 1970-01-01
    • 2010-09-10
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多