java - 使用 Nashorn 匹配 Javascript RegEx

标签 java regex java-8 ecmascript-5 nashorn

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

最佳答案

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

关于java - 使用 Nashorn 匹配 Javascript RegEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571402/

相关文章:

C# 和 Regex - 无法识别的分组构造

regex - 使用正则表达式提取 SAS 中的子字符串

java - java中流的管道如何像IntPipeline一样工作

java - 从 HTML 片段中移除空标签对

Javascript/jQuery 变量的首字母大写,带重音符号

java - 运行 JavaFX 项目 JAR 时为 "NullPointerException: Location is required.",但从 IDE 运行时则不然

java - LocalDate Formatter 月份基数

java - 如何在 Java 8 中强制转换 Stream.empty()?

java - 外键更新异常: foreign keys set to null in Hibernate one-to-many relationship

java - 列出自使用 JGit 从 master 创建分支以来的所有提交