2009-11-15 7 views
10

자바에서 부울 표현식을 평가하는 비교적 간단한 방법을 찾고 있는데 JEP 라이브러리를 사용하고 싶지 않습니다.자바에서 부울 표현식 평가

저는 (x > 4 || x < 8 && p > 6)과 같은 String 표현식을 사용하고 있습니다. 제 목표는 변수를 값으로 대체하는 것입니다.

이 표현식을 평가할 수있는 방법이 있습니까?

이것은 어느 수준이라도 깊을 수 있으므로 파서 작성은 매우 복잡합니다.

답변

6

당신은 Java6에서 스크립팅 엔진을 사용할 수와는 Scala, Ruby, Python, GroovyJavascript 같은 인기있는 스크립트 언어 중 하나를 선택합니다. 당신이해야 할 일은 평가하고자하는 표현이 올바른 언어로되어 있는지 확인하는 것입니다. Groovy가 아마도 가장 쉽고 잘 통합 될 것입니다.

필자는 널리 사용되는 스프레드 시트 응용 프로그램의 수식/계산 열과 비슷한 기능을 제공하는 기능에이 메서드를 성공적으로 사용했습니다. http://lts.online.fr/dev/java/math.evaluator/

예에서 사용할 수있는 API가

0

JUEL은 명시 적으로 JSP에 연결하지 않고 Java의 통합 표현 언어를 구현합니다. 여기에 Quick Start guide의 표현식 평가 (해당 페이지의 # 3)가 관심있는 부분입니다.

또는 Spring 3.0은 고유 한 (다소 유사하지만) 표현 언어를 제공합니다. 이 옵션은 Spring을 이미 사용하고있는 경우에만 의미가 있습니다. EL에서는 사용하지 않을 것입니다.

14

Apache Commons Jexl을 사용하십시오. 이는 그러한 요구 사항을 위해 정확하게 설계된 것입니다.

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

+1

+1 어떻게 사용했는지 보여주는 좋은 예입니다. http://commons.apache.org/jexl/reference/examples.html – blak3r

0

:

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

적어도이 글을 쓰는 시점에서는이 링크가 작동하지 않는 것 같습니다. 또한이 라이브러리는 비교 연산자와 OP와 같은 'boolean'값을 지원합니까? – andr

7

, 당신은 JANINO 시도이

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

jexl에서 내가 가진 한 가지 문제는 우선 순위 결정이었습니다. 나는 내가 평가할 필요가있는 경우가있다. || &&를 평가하기 전에. 따라서 위 식은 (a || b) && (c && d)가됩니다. jexl에서 'a'라는 컨텍스트를 사용하면 true로 평가됩니다. – Joseph

+0

참조 용 :'(a || b) && (c && d)'라는 표현으로 예제를 시도했지만 수정 된 것 같습니다. 그냥 'a'는 '거짓'으로 평가됩니다. – membersound

0

이 라이브러리를 사용해 볼 수 있습니다. https://github.com/Shy-Ta/expression-evaluator-demo - 읽기에는 상당한 수의 예제가 있습니다. 라이브러리는 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(); 
관련 문제