[quote=Ataxexe]Mais uma vez: leia o código que postei.
As notas devem ser atribuídas pelos bindings e não por uma regexp:
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("np1", 0);
bindings.put("np2", 0);
bindings.put("np3", 0);
bindings.put("np4", 0);
E, se a fórmula for inválida sintaticamente, não será retornado null, será lançada uma exceção, que você deve tratar para retornar se a fórmula é válida ou inválida.
try {
scriptEngine.eval(formula);
} catch (ScriptException e) {
System.out.println("Fórmula inválida");
}
System.out.println("Fórmula válida");
Com algumas pequenas adaptações no código que postei você resolve seu problema. Eu tenho minhas dúvidas se esse seu código irá funcionar (a menos que você esteja capturando ScriptException para tratar.
Verificar o retorno da fórmula é uma adaptação válida para testar se não há algo de errado (você pode, por exemplo, atribuir a nota máxima para cada prova e testar se o valor da fórmula estará dentro do aceitável - seria estranho um aluno obter de média 8 com todas as notas 10). Você poderia até quebrar isso em dois passos: um para verificar sintaticamente a fórmula e outro para testar se ela está coesa.[/quote]
Bom dia Ataxexe , tdo certo cara? Bem, consegui fazer da seguinte maneira:
public boolean verificaCoerenciaFormulAnual() throws ScriptException {
String formulaAnual = crudObj.getFormulaAvaliacao();
String REGEX = "(np\\d)";
// Double[] notas = {9.5, 9.3, 8.0, 8.8};
StringBuffer novaFormula = new StringBuffer();
Matcher buscador = Pattern.compile(REGEX).matcher(formulaAnual);
// int i = 0;
while (buscador.find()) {
buscador.appendReplacement(novaFormula, "10.0");
}
buscador.appendTail(novaFormula);
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
Object resultado = scriptEngine.eval(novaFormula.toString());
if (resultado != null) {
return true;
} else {
return false;
}
}
A princípio funcionou…Agora estou vendo para testar outra fórmula, pois tenho a fórmula que pode contem nt e ne… Daí estou tentando usar assim:
String REGEX = "(nt\\d|ne\\d)";
...ou
String REGEX = "(n[te]\\d)";
Só que n]ao está dando certo, pq ele não tá conseguindo montar a fórmula.Estou fazendo da mesma maneira do que fiz anteriormente…Poderia dar uma ajuda aí? Vlwww