为什么我在 JS 脚本中出错?

Why do I get error in JS script?

我是 运行 一个 JS 脚本,这是正确的 但是当我在 Nashorn 中 运行 时出现错误。
为什么这是错误吗?
仅在 Nashorn 之外编译 JS 时,它运行正确并且没有显示任何错误,但这只发生在 Nashorn 中。

JS

function process(val) {
    var isPeso = "(?:k|m|g)b$";
    var normalizado = val.trim().toLowerCase().replace(" ", "");
    var unidade = "";
    var numberPattern = /\d+(\.\d{1,2})?|(Livre)/i;
    var myArray = [];
    if(isPeso.test(myArray)) {
        myArray = normalizado.match(isPeso);
    }
    if (myArray != null) {
        unidade = myArray;
        var i;
        var valores = [];

        if(numberPattern.test(val)) {
            var getNumbers = val.match(numberPattern);

            for (i = 0; i < getNumbers.length - 1; i++) {
                valores.push(getNumbers[i]);
            }
        }
        var out = "";
        //Caso [X ou superior]
        if (normalizado.indexOf("superior") > -1) {
            return valores[0] + unidade + " ou superior";
        }
        //Caso [X até Y] e [até Y]
        else if (normalizado.indexOf("até") > -1) {
            //Caso [até Y]
            if (valores.length == 1) {
                out = "até " + valores[0];
            }
            //Caso [X até Y]
            else {
                out = valores[0] + " até " + valores[1];
            }
        }

        //Caso [X ou Y] ou [X ou Y ou ...]
        else if (normalizado.indexOf("ou") > -1 || normalizado.indexOf("/") > -1) {
            out = valores[0];
            for (i = 1; i < valores.length - 1; i++) {
                out += valores[i];
            }
        }
        //Caso livre
        else if (normalizado.indexOf("*") > -1 || normalizado.indexOf("livre") > -1) {
            out = "Livre";
        }
        //Caso X
        else {
            if (valores.length > 0) {
                out = valores[0];
            }
        }
        if (out.length == 0 || out == null) {
            return "";
        }

        return out + unidade;
    }
}

日志

javax.script.ScriptException: TypeError: (?:k|m|g)b$ has no such function "test" in <eval> at line number 1

该字符串不是有效的正则表达式,并且您的数组为空,因此测试 return 为假。这是一个有效的版本:

var isPeso = /(?:k|m|g)b$/;

您的 regexp 模式无效,您缺少 / 个字符:

var isPeso = /(?:k|m|g)b$/;

作为一个提示,您可以向 String 原型添加一个函数,这样您就可以编写包含方法而不是检查 indexOf

String.prototype.contains = function(input) { return this.indexOf(input) != -1; };

这应该使您的代码更具可读性。

@mplungjan 的响应时间超过了我:)