12

Javaでブール式を評価するための比較的簡単な(パーサーを作成する場合と比較して)方法を探していますが、JEPライブラリを使用したくありません。

次のような文字列式が(x > 4 || x < 8 && p > 6)あります。私の目的は、変数を値に置き換えることです。

この式を評価する方法はありますか?

これはどのレベルでも深くなる可能性があるため、パーサーの作成は非常に複雑になることに注意してください。

4

10 に答える 10

16

ApacheCommonsJexlを使用します。これはまさにそのような要件のために設計されています。

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

于 2009-11-15T05:47:05.510 に答える
7

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));
于 2012-09-20T14:24:50.963 に答える
6

Java6でスクリプトエンジンを使用して、ScalaRubyPythonGroovyJavascriptなどの一般的なスクリプト言語のいずれかを選択できます。あなたがしなければならないのは、あなたが評価したい表現が正しい言語であることを確認することだけです。Groovyはおそらく最も簡単で、最適に統合されます。

私はこの方法を、人気のあるスプレッドシートアプリケーションの数式/計算列のような機能を提供するためにうまく使用しました。

于 2009-11-15T05:53:41.440 に答える
1

式評価フレームワークの最新リソースは次のとおりです

情報ページはhttp://expressionoasis.vedantatree.com/にあります

于 2010-10-29T18:33:40.837 に答える
0

JUELは、JSPに明示的に結び付けられることなく、Javaの統一式言語の実装を提供します。これがクイックスタートガイドです。式の評価(そのページの#3)はあなたが興味を持っている部分です。

あるいは、Spring 3.0は、独自の(多少似ていますが)表現言語を提供します。ただし、このオプションは、すでにSpringを使用している場合にのみ意味があります。ただし、ELのためだけに使用することはしません。

于 2009-11-15T05:38:53.987 に答える
0

http://lts.online.fr/dev/java/math.evaluator/で利用可能なAPIがあります

例:

MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println( m.getValue() );
于 2010-01-29T10:59:12.747 に答える
0

オープンソースの実装については、http://code.google.com/p/xpressionengine/をお試しください

于 2010-03-21T15:08:00.830 に答える
0

ここにリストされているライブラリは、私のニーズには複雑すぎることがわかりました。私はFscriptを使用することになりました:http: //fscript.sourceforge.net/

于 2011-12-29T23:22:10.837 に答える
0

Janinoを試し てみてください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);
于 2013-08-09T09:21:37.130 に答える
0

このライブラリを試すことができますhttps://github.com/Shy-Ta/expression-evaluator-demo-readmeにはかなりの数の例があります。ライブラリは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();
于 2015-01-01T10:25:53.263 に答える