[Resolvido] Validar fórmula matemática que está como String

O detalhe importante é. após o nt ou ne não pode ter um número. É isso que sua expressão tem que declarar

Vamos lá mais uma vez para testes entao…:slight_smile:

To conseguindo deixar assim:

    private boolean formulaAvalMediaFinalVerdadeira() {
        Pattern p = Pattern.compile("(\\d|[+*/().-]|n[te]\\D|np\\d+|\\s+)*");
        Matcher m = p.matcher(crudObj.getFormulAvalMediaFinal());
        return m.matches();
    }

public boolean verificaCoerenciaFormulFinal() throws ScriptException {
        String formulaFinal = crudObj.getFormulAvalMediaFinal();
        String REGEX = "(n[te]|np\\d)";
        StringBuffer novaFormulaFinal = new StringBuffer();
        Matcher buscador = Pattern.compile(REGEX).matcher(formulaFinal);

        while (buscador.find()) {
            buscador.appendReplacement(novaFormulaFinal, "10.0");
        }
        buscador.appendTail(novaFormulaFinal);
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
        Object resultadoFinal = scriptEngine.eval(novaFormulaFinal.toString());

        if (resultadoFinal != null) {
            return true;
        } else {
            return false;
        }
    }

Só que agora ele nao deixa por exemplo eu SOMENTE colocar o nt + ne, devo ter tbm um np1 junto por exemplo…Dicas?? Vlw Rodrigo…

Não faz sentido, que expressão matemática você está usando pra testar?

Por exemplo:

(np1 + np2 + np3)/ 3  //deve deixar passar
(nt + ne)/2                //deveria deixar passar mas nao deixa
(nt + np1)/2              // somente assim deixa passar

Tipo, está deixando passar somente quando coloco um np ao menos na fórmula…Poderia dar uma mão aí?? Vlw…

Testei aqui e ele validou as 3

Mas que diabos está acontecendo será??

Dessa maneira que eu estou validando está certo ?? Somente deixar que vá numeros quando o cara digita np: exemplo -> np1 + np2…
E deixar ele digitar tambem somente nt + ne SEM números???

Sim, veja:[code]public class Teste {

public static void main(String[] args) {
	validate("(np1 + np2 + np3)/ 3"); // true
	validate("(nt + ne)/2"); // true
	validate("(nt + np1)/2"); // true
	validate("(nt3 + np)"); // false
	validate("ne4"); // false
}

public static void validate(String str) {
	Pattern pattern = Pattern.compile("(\\d|[+*/().-]|n[te]\\D|np\\d+|\\s+)*");
	Matcher matcher = pattern.matcher(str);
	System.out.println(matcher.matches());
}

}[/code]

[quote=Rodrigo Sasaki]Sim, veja:[code]public class Teste {

public static void main(String[] args) {
	validate("(np1 + np2 + np3)/ 3"); // true
	validate("(nt + ne)/2"); // true
	validate("(nt + np1)/2"); // true
	validate("(nt3 + np)"); // false
	validate("ne4"); // false
}

public static void validate(String str) {
	Pattern pattern = Pattern.compile("(\\d|[+*/().-]|n[te]\\D|np\\d+|\\s+)*");
	Matcher matcher = pattern.matcher(str);
	System.out.println(matcher.matches());
}

}[/code][/quote]
Estou tentando colocar somente assim: nt + ne e ele nao está deixando…

Pra mim funciona :slight_smile: Sem brincadeira. Com o código que postei aí pra você

Ok, mas vc colocou assim:

(nt + ne)/2

Será que sem os () /2 , somente com nt + ne funciona no teu tbm ?? No meu nao tá funcionando…

ah ta

“n[te]\D?”

[quote=Rodrigo Sasaki]ah ta

“n[te]\D?”[/quote]
Desculpe, mas não entendi…

[quote=Rodrigo Sasaki]ah ta

“n[te]\D?”[/quote]
Consegui, acredito que é somente colocar um “+” depois do D, correto? Vlw

Não, no caso tem que ser a interrogação mesmo :slight_smile:

Bom dia Rodrigo, tdo certo ?? Desculpe, mas onde exatamente??

private boolean formulaAvalMediaFinalVerdadeira() {
        Pattern p = Pattern.compile("(\\d|[+*/().-]|n[te]\\D+|np\\d+|\\s+)*");
        Matcher m = p.matcher(crudObj.getFormulAvalMediaFinal());
        return m.matches();
    }

   public boolean verificaCoerenciaFormulFinal() throws ScriptException {
        String formulaFinal = crudObj.getFormulAvalMediaFinal();
        String REGEX = "(n[te]|np\\d)";
        StringBuffer novaFormulaFinal = new StringBuffer();
        Matcher buscador = Pattern.compile(REGEX).matcher(formulaFinal);

        while (buscador.find()) {
            buscador.appendReplacement(novaFormulaFinal, "10.0");
        }
        buscador.appendTail(novaFormulaFinal);
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
        Object resultadoFinal = scriptEngine.eval(novaFormulaFinal.toString());

        if (resultadoFinal != null) {
            return true;
        } else {
            return false;
        }
    }

A princípio tinha funcionado, mas porvias das dúvidas, queria saber onde devo alterar…Abc

Só ver aonde eu coloquei a interrogação. logo após o \D

Ela indica que se existir algo após o nt ou ne, não pode ser um número.

[quote=Rodrigo Sasaki]Só ver aonde eu coloquei a interrogação. logo após o \D

Ela indica que se existir algo após o nt ou ne, não pode ser um número.[/quote]
Blz Rodrigo, mto obrigado pela ajuda…Vlw msm…Abc

[quote=Rodrigo Sasaki]Só ver aonde eu coloquei a interrogação. logo após o \D

Ela indica que se existir algo após o nt ou ne, não pode ser um número.[/quote]
Boa tarde Rodrigo, tdo certo ?? Cara, achei um furo nas validações…Seguinte, se o cara colocar na fórmula só () ele nao salva, mas dá o seguinte erro no console:

Grave:   javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: syntax error (<Unknown source>#1) in <Unknown source> at line number 1
.
.
.
Caused by: sun.org.mozilla.javascript.internal.EvaluatorException: syntax error (<Unknown source>#1)
	at sun.org.mozilla.javascript.internal.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:109)
	at sun.org.mozilla.javascript.internal.DefaultErrorReporter.error(DefaultErrorReporter.java:96)
	at sun.org.mozilla.javascript.internal.Parser.addError(Parser.java:231)
	at sun.org.mozilla.javascript.internal.Parser.addError(Parser.java:209)
	at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:266)
	at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:253)
	at sun.org.mozilla.javascript.internal.Parser.reportError(Parser.java:246)
	at sun.org.mozilla.javascript.internal.Parser.primaryExpr(Parser.java:2862)
	at sun.org.mozilla.javascript.internal.Parser.memberExpr(Parser.java:2459)
	at sun.org.mozilla.javascript.internal.Parser.unaryExpr(Parser.java:2369)
	at sun.org.mozilla.javascript.internal.Parser.mulExpr(Parser.java:2292)
	at sun.org.mozilla.javascript.internal.Parser.addExpr(Parser.java:2274)
	at sun.org.mozilla.javascript.internal.Parser.shiftExpr(Parser.java:2253)
	at sun.org.mozilla.javascript.internal.Parser.relExpr(Parser.java:2226)
	at sun.org.mozilla.javascript.internal.Parser.eqExpr(Parser.java:2196)
	at sun.org.mozilla.javascript.internal.Parser.bitAndExpr(Parser.java:2183)
	at sun.org.mozilla.javascript.internal.Parser.bitXorExpr(Parser.java:2170)
	at sun.org.mozilla.javascript.internal.Parser.bitOrExpr(Parser.java:2157)
	at sun.org.mozilla.javascript.internal.Parser.andExpr(Parser.java:2144)
	at sun.org.mozilla.javascript.internal.Parser.orExpr(Parser.java:2131)
	at sun.org.mozilla.javascript.internal.Parser.condExpr(Parser.java:2107)
	at sun.org.mozilla.javascript.internal.Parser.assignExpr(Parser.java:2076)
	at sun.org.mozilla.javascript.internal.Parser.expr(Parser.java:2053)
	at sun.org.mozilla.javascript.internal.Parser.parenExpr(Parser.java:2875)
	at sun.org.mozilla.javascript.internal.Parser.primaryExpr(Parser.java:2810)
	at sun.org.mozilla.javascript.internal.Parser.memberExpr(Parser.java:2459)
	at sun.org.mozilla.javascript.internal.Parser.unaryExpr(Parser.java:2369)
	at sun.org.mozilla.javascript.internal.Parser.mulExpr(Parser.java:2292)
	at sun.org.mozilla.javascript.internal.Parser.addExpr(Parser.java:2274)
	at sun.org.mozilla.javascript.internal.Parser.shiftExpr(Parser.java:2253)
	at sun.org.mozilla.javascript.internal.Parser.relExpr(Parser.java:2226)
	at sun.org.mozilla.javascript.internal.Parser.eqExpr(Parser.java:2196)
	at sun.org.mozilla.javascript.internal.Parser.bitAndExpr(Parser.java:2183)
	at sun.org.mozilla.javascript.internal.Parser.bitXorExpr(Parser.java:2170)
	at sun.org.mozilla.javascript.internal.Parser.bitOrExpr(Parser.java:2157)
	at sun.org.mozilla.javascript.internal.Parser.andExpr(Parser.java:2144)
	at sun.org.mozilla.javascript.internal.Parser.orExpr(Parser.java:2131)
	at sun.org.mozilla.javascript.internal.Parser.condExpr(Parser.java:2107)
	at sun.org.mozilla.javascript.internal.Parser.assignExpr(Parser.java:2076)
	at sun.org.mozilla.javascript.internal.Parser.expr(Parser.java:2053)
	at sun.org.mozilla.javascript.internal.Parser.statementHelper(Parser.java:1082)
	at sun.org.mozilla.javascript.internal.Parser.statement(Parser.java:944)
	at sun.org.mozilla.javascript.internal.Parser.parse(Parser.java:569)
	at sun.org.mozilla.javascript.internal.Parser.parse(Parser.java:531)
	at sun.org.mozilla.javascript.internal.Context.compileImpl(Context.java:2428)
	at sun.org.mozilla.javascript.internal.Context.compileReader(Context.java:1345)
	at sun.org.mozilla.javascript.internal.Context.compileReader(Context.java:1317)
	at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1156)
	at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214)
	... 80 more

Poderia dar uma ajuda aí?
O teste tá da seguinte maneira:

private boolean formulaAvalMediaFinalVerdadeira() {
        Pattern p = Pattern.compile("(\\d|[+*/().-]|n[te]\\D+|np\\d+|\\s+)*");
        Matcher m = p.matcher(crudObj.getFormulAvalMediaFinal());
        return m.matches();
    }

    public boolean verificaCoerenciaFormulFinal() throws ScriptException {
        String formulaFinal = crudObj.getFormulAvalMediaFinal();
        String REGEX = "(n[te]|np\\d)";
        StringBuffer novaFormulaFinal = new StringBuffer();
        Matcher buscador = Pattern.compile(REGEX).matcher(formulaFinal);

        while (buscador.find()) {
            buscador.appendReplacement(novaFormulaFinal, "10.0");
        }
        buscador.appendTail(novaFormulaFinal);
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
        Object resultadoFinal = scriptEngine.eval(novaFormulaFinal.toString());

        if (resultadoFinal != null) {
            return true;
        } else {
            return false;
        }
    }

Se puder ajudar, agradeço mto…Vlwww