Возвращение подэкспрессии/условий из логического выражения, что привело к окончательному истинному результатуJAVA

Программисты JAVA общаются здесь
Anonymous
Возвращение подэкспрессии/условий из логического выражения, что привело к окончательному истинному результату

Сообщение Anonymous »

У меня есть уравнение как:
String equation = "((((15>=1 && 50>=10) || (60>=1 && 40>=21)) && (20=1 && 20>=17))";
Я хочу знать, какие условия отвечают за возврат true/false;
В этом случае ожидаемый результат:- ( 15> = 1 && 50> = 10) && (20
((((15>=1 && 50>=10) || (60>=1 && 40>=21)) && (20=1 && 20>=17))

in this case:- [WORKING AS PER EXPECTATION]
current output -- (15>=1 && 50>=10) && (20=1 && 50>=10) && (20=1 && 50>=10) || (60>=1 && 40>=21)) && (200=1 && 20>=17))

in this case:- [FAILED]
current output -- (15>=1 && 50>=10), (60>=1 && 20>=17) -- [(15>=1 && 50>=10) // 200=1 && 20>=17)
< /code>
Уравнения в режиме реального времени будут еще более сложными, это просто примерное уравнение, так что любезно даст решение, которое будет работать со всеми возможными уравнениями. < /p>
Я использую jdk 11 < /p>
javascript name: oracle nashorn < /p>
Версия двигателя: 11.0.25 < /p>
Почему не Мой код дает предполагаемый результат?import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.*;
import java.util.regex.*;

public class ExpressionSplitter
{
public static void Runner()
{
String expression = "((((15>=1 && 50>=10) || (60>=1 && 40>=21)) && (20=1 && 20>=17))";

try
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String loggedExpression = wrapExpressionsWithLogging(expression);
Bindings bindings = engine.createBindings();
Object result = engine.eval(loggedExpression, bindings);
List trueConditions = (List) bindings.get("trueConditions");

} catch (ScriptException e) {
e.printStackTrace();
}
}

private static String wrapExpressionsWithLogging(String expression) {
Pattern pattern = Pattern.compile("\\(([^()]+)\\)");
Matcher matcher = pattern.matcher(expression);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String subExpression = matcher.group(1);
matcher.appendReplacement(sb, "logResult((" + subExpression + "), '" + subExpression.replace("'", "\\'") + "')");
}
matcher.appendTail(sb);

return "var trueConditions = []; function logResult(result, expression) { if(result){trueConditions.push(expression)}; return result; }" + sb.toString() + "; trueConditions;";
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... resulted-i

Вернуться в «JAVA»