Оценка булевых выражений в Java - PullRequest
10 голосов
/ 15 ноября 2009

Я ищу относительно более простой (по сравнению с написанием синтаксического анализатора) способ оценки логических выражений в Java, и я не хочу использовать библиотеку JEP.

У меня есть строковое выражение типа: (x > 4 || x < 8 && p > 6), и моя цель - заменить переменные значениями.

Есть ли способ, которым я могу оценить это выражение?

Имейте в виду, что это может быть любой уровень, поэтому написание парсера будет очень сложным.

Ответы [ 10 ]

14 голосов
/ 15 ноября 2009

Используйте Apache Commons Jexl; который точно разработан для такого требования.

http://commons.apache.org/jexl/

7 голосов
/ 20 сентября 2012

Используя jexl (http://commons.apache.org/jexl/),, вы можете сделать это, как это

    JexlEngine jexl = new JexlEngine();
    jexl.setSilent(true);
    jexl.setLenient(true);

    Expression expression = jexl.createExpression("(a || b && (c && d))");
    JexlContext jexlContext = new MapContext();

    //b and c and d should pass
    jexlContext.set("b",true);
    jexlContext.set("c",true);
    jexlContext.set("d",true);

    assertTrue((Boolean)expression.evaluate(jexlContext));

    jexlContext = new MapContext();

    //b and c and NOT d should be false
    jexlContext.set("b",true);
    jexlContext.set("c",true);

    //note this works without setting d to false on the context
    //because null evaluates to false

    assertFalse((Boolean)expression.evaluate(jexlContext));
6 голосов
/ 15 ноября 2009

Вы можете использовать механизм сценариев в Java6 и выбрать любой из популярных языков сценариев, таких как Scala , Ruby , Python Groovy и Javascript . Все, что вам нужно сделать, - это убедиться, что выражение, которое вы хотите оценить, написано на правильном языке. Groovy, вероятно, самый простой и лучше интегрируется.

Я успешно использовал этот метод для функции, предоставляющей возможности, аналогичные столбцу формулы / вычисления в популярном приложении для работы с электронными таблицами.

1 голос
/ 29 октября 2010

Вот последние ресурсы для структуры оценки выражений

Информация на странице http://expressionoasis.vedantatree.com/

0 голосов
/ 01 января 2015

Вы можете попробовать эту библиотеку https://github.com/Shy-Ta/expression-evaluator-demo - у read me достаточно примеров. Библиотека использует Java и Groovy.

Помимо поддержки этого варианта использования, он также поддерживает множество других функций, подобных Excel. Кроме того, очень просто добавлять новые функции, как показано в примере.

      ExpressionsEvaluator evalExpr = ExpressionsFactory.create("(x > 4 || x < 8 && p > 6)");  
      Map<String, Object> variables = new HashMap<String, Object>();  
      variables.put("x", 100);  
      variables.put("p", 10);
      evalExpr.eval();
0 голосов
/ 09 августа 2013

попробуй Янино http://docs.codehaus.org/display/JANINO/Home Его очень просто использовать, например (взято из http://docs.codehaus.org/display/JANINO/Basic):

// Compile the expression once; relatively slow.
ExpressionEvaluator ee = new ExpressionEvaluator(
    "c > d ? c : d",                     // expression
    int.class,                           // expressionType
    new String[] { "c", "d" },           // parameterNames
    new Class[] { int.class, int.class } // parameterTypes
);

// Evaluate it with varying parameter values; very fast.
Integer res = (Integer) ee.evaluate(
    new Object[] {          // parameterValues
        new Integer(10),
        new Integer(11),
    }
);
System.out.println("res = " + res);
0 голосов
/ 30 декабря 2011

Я нашел библиотеки, перечисленные здесь, слишком сложными для моих нужд. Я закончил с использованием Fscript: http://fscript.sourceforge.net/

0 голосов
/ 21 марта 2010

Попробуйте http://code.google.com/p/xpressionengine/ для реализации с открытым исходным кодом

0 голосов
/ 29 января 2010

API доступен на http://lts.online.fr/dev/java/math.evaluator/

Пример:

MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println( m.getValue() );
0 голосов
/ 15 ноября 2009

JUEL обеспечивает реализацию языка унифицированных выражений Java без явной привязки к JSP. Вот Краткое руководство по началу работы , оценка выражений (# 3 на этой странице) - это та часть, которая вас интересует.

В качестве альтернативы, Spring 3.0 предоставляет свой собственный (хотя и несколько похожий) язык выражений. Этот вариант имеет смысл, только если вы уже используете Spring - я бы не стал использовать его только для EL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...