有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Nashorn的java匹配Javascript正则表达式

我如何使用符合ECMA 262的正则表达式计算输入
读了一些书之后,我发现Java8的javascript引擎nashorn可以帮助我做到这一点
如何使用nashorn脚本引擎匹配正则表达式


共 (3) 个答案

  1. # 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);
    

    为了调用函数,首先必须将脚本引擎强制转换为^{}。该接口由NashornScriptEngine实现,并定义了一个方法^{}来为给定名称调用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. # 2 楼答案

    使用Java8,您可以通过使用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

    你会想要熟悉ScriptEngine类,你需要做大量的测试和试用&;处理返回的数据时出错,因为返回的数据不是类型安全的。在此过程中,调试器将是您最好的朋友

  3. # 3 楼答案

    也许是这样的:

    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