Why is my variable null?

2

I'm translating a function from Java to JS, the logic remains the same but the results are different.
On regular expression test , returns match when testo 40kb but when compiling the code gets a null on an unspecified line.

Why when testo "2kb" is not null and with "40kb" I get error in JS?

Log

Error:
TypeError: getNumbers is null

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 = normalizado.match(isPeso);
        if (myArray != null) {
            unidade = myArray;

            var getNumbers = val.match(numberPattern);
            var i;
            var valores = [];
            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;
        }
    }

Java

public class IntervaloHandler implements LanguageInterface{
    public static final Pattern NUMBER_PATTERN = Pattern.compile("\d+(\.\d{1,2})?|(Livre)", Pattern.CASE_INSENSITIVE);
     public String normalizar(String in) throws LanguageHandler.NormalizarExcception {
            //Trim e LowerCase
            String normalizado = in.trim().toLowerCase(new Locale("pt", "BR"));

            //Identifica a unidade
            String unidade = "";

            Pattern tempoPattern = Pattern.compile("s$");
            Matcher tempoMatcher = tempoPattern.matcher(normalizado);

            Pattern bytesPattern = Pattern.compile("(k|m|g)b$");
            Matcher matcher = bytesPattern.matcher(normalizado);

            //Bytes (PESO)
            if(matcher.find()){
                unidade = matcher.group();
            }

            //Encontra os valores e formata
            ArrayList<String> valores = new ArrayList<>();
            Matcher m = NUMBER_PATTERN.matcher(in);
            while(m.find()){
                valores.add(m.group().replaceAll(" ", ""));
            }
            String out = "";





            //Caso [X ou superior]
            if(normalizado.contains("superior")){
                return String.format("%s%s ou superior", valores.get(0), unidade);
            }
            //Caso [X até Y] e [até Y]
            else if(normalizado.contains("até")){
                //Caso [até Y]
                if(valores.size() == 1){
                    out = String.format("até %s", valores.get(0));
                }
                //Caso [X até Y]
                else{
                    out = String.format("%s até %s", valores.get(0), valores.get(1));
                }
            }
            //Caso [X ou Y] ou [X ou Y ou ...]
            else if(normalizado.contains("ou") || normalizado.contains("/")){
                out = valores.get(0);
                for(int i=1; i < valores.size(); i++){
                    out += String.format("/%s", valores.get(i));
                }
            }
            //Caso livre
            else if(normalizado.contains("*") || normalizado.contains("livre")) {
                out = "Livre";
            }
            //Caso X
            else {
                if(valores.size() > 0)
                    out = valores.get(0);
            }




            //Coloca a unidade no final
            return out.isEmpty() ? "" : String.format("%s%s", out, unidade);
        }
}
    
asked by anonymous 27.04.2015 / 14:52

1 answer

2

Your variable is null because the regular expression does not "house" anything in the examples, not even 2kb worked around here.

It does not match any part of the input because it is not a valid regular expression of the form that is declared, ie the syntax is incorrect.

Prefer to use regular expressions literals . So instead of this:

"\d+(\.\d{1,2})?|(Livre)/i"

use this:

/\d+(\.\d{1,2})?|(Livre)/i

But why? Well, this \ is a string escape character, so you'd prefer literals to be more elegant and even more readable and simple to represent the expression, otherwise you'd need this:

"\d+(\.\d{1,2})?|(Livre)\/i"

or this:

var reg = new RegExp("\d+(\.\d{1,2})?|(Livre)", "i");

It's much more convenient to use literals, is not it? =)

See an example of the literal form:

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 = normalizado.match(isPeso);
    if (myArray != null) {
        unidade = myArray;

        var getNumbers = val.match(numberPattern);
        var i;
        var valores = [];
        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;
    }
}
function test() {
    var val = document.getElementById("input").value;
    var result = process(val);
    document.getElementById("span").innerHTML = "Resultado: entrada: " + val + " | saida: " + result;
}
<input id="input" />
<button onclick="test()">GO</button>
<p>
    <span id="span">Resultado: </span>
</p>

And one using string "escapades":

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 = normalizado.match(isPeso);
    if (myArray != null) {
        unidade = myArray;

        var getNumbers = val.match(numberPattern);
        var i;
        var valores = [];
        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;
    }
}
function test() {
    var val = document.getElementById("input").value;
    var result = process(val);
    document.getElementById("span").innerHTML = "Resultado: entrada: " + val + " | saida: " + result;
}
<input id="input" />
<button onclick="test()">GO</button>
<p>
    <span id="span">Resultado: </span>
</p>
    
27.04.2015 / 16:24