Frage

Ich suche eine relativ einfachere Art (im Vergleich zum Schreiben eines Parsers), um Boolesche Ausdrücke in Java zu bewerten, und ich möchte die JEP -Bibliothek nicht verwenden.

Ich habe einen String -Ausdruck wie: (x > 4 || x < 8 && p > 6) Und mein Ziel ist es, die Variablen durch Werte zu ersetzen.

Gibt es eine Möglichkeit, wie ich diesen Ausdruck bewerten kann?

Denken Sie daran, dass dies jede Ebene tief sein kann, so dass das Schreiben eines Parsers sehr komplex wäre.

War es hilfreich?

Lösung

Sie können den Skriptmotor in verwenden Java6 und die wählen Sie eine der beliebten Skriptsprachen wie Scala, Rubin, Python, Groovig, und JavaScript. Alles, was Sie tun müssen, ist sicherzustellen, dass der Ausdruck, den Sie bewerten möchten, in der richtigen Sprache ist. Groovy ist wahrscheinlich am einfachsten und wird am besten integriert werden.

Ich habe diese Methode erfolgreich für ein Feature -Angebotsfunktionen wie eine Formel / berechnete Spalte in einer beliebten Tabellenkalkulationsanwendung verwendet.

Andere Tipps

Verwenden Sie Apache Commons JEXL; Dies ist genau für eine solche Anforderung ausgelegt.

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

Verwenden von JEXL (http://commons.apache.org/jexl/), Sie können dies so erreichen

    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));

Hier sind die neuesten Ressourcen für den Ausdrucksbewertungsrahmen

Die Informationsseite ist bei http://expressionoasis.vedantatree.com/

Juel Bietet eine Implementierung der einheitlichen Ausdruckssprache von Java, ohne ausdrücklich an JSP gebunden zu sein. Hier ist es Schnellstartanleitung, Expression Evaluation (#3 auf dieser Seite) ist der Teil, an dem Sie interessiert sind.

Alternative, Frühling 3.0 Bietet eine eigene (wenn auch etwas ähnliche) Ausdruckssprache. Diese Option macht nur dann sinnvoll, wenn Sie bereits Frühling verwenden - ich würde sie nicht nur für EL einziehen.

Versuchen http://code.google.com/p/xpressionengine/ Für Open Source -Implementierung

Ich fand die hier aufgeführten Bibliotheken für meine Bedürfnisse zu kompliziert. Am Ende habe ich fscript verwendet:http://fscript.sourceforge.net/

Es gibt eine API bei http://lts.online.fr/dev/java/math.evaluator/

Beispiel:

MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println( m.getValue() );

Probieren Sie Janinohttp://docsehaus.org/display/janino/homeEs ist sehr einfach zu verwenden, um EG (entnommen von von http://docsehaus.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);

Sie könnten diese Bibliothek ausprobieren https://github.com/shy-ta/expression-evaluator-demo - Das Read Me hat eine ganze Reihe von Beispielen. Die Bibliothek verwendet Java und Groovy.

Zusätzlich zur Unterstützung dieses Anwendungsfalls unterstützt es auch viele andere Excel -ähnliche Funktionen. Außerdem ist es sehr einfach, neue Funktionen hinzuzufügen, wie im Beispiel gezeigt.

      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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top