자바에서 부울 표현식을 평가하는 비교적 간단한 방법을 찾고 있는데 JEP 라이브러리를 사용하고 싶지 않습니다.자바에서 부울 표현식 평가
저는 (x > 4 || x < 8 && p > 6)
과 같은 String 표현식을 사용하고 있습니다. 제 목표는 변수를 값으로 대체하는 것입니다.
이 표현식을 평가할 수있는 방법이 있습니까?
이것은 어느 수준이라도 깊을 수 있으므로 파서 작성은 매우 복잡합니다.
자바에서 부울 표현식을 평가하는 비교적 간단한 방법을 찾고 있는데 JEP 라이브러리를 사용하고 싶지 않습니다.자바에서 부울 표현식 평가
저는 (x > 4 || x < 8 && p > 6)
과 같은 String 표현식을 사용하고 있습니다. 제 목표는 변수를 값으로 대체하는 것입니다.
이 표현식을 평가할 수있는 방법이 있습니까?
이것은 어느 수준이라도 깊을 수 있으므로 파서 작성은 매우 복잡합니다.
당신은 Java6에서 스크립팅 엔진을 사용할 수와는 Scala, Ruby, Python, Groovy 및 Javascript 같은 인기있는 스크립트 언어 중 하나를 선택합니다. 당신이해야 할 일은 평가하고자하는 표현이 올바른 언어로되어 있는지 확인하는 것입니다. Groovy가 아마도 가장 쉽고 잘 통합 될 것입니다.
필자는 널리 사용되는 스프레드 시트 응용 프로그램의 수식/계산 열과 비슷한 기능을 제공하는 기능에이 메서드를 성공적으로 사용했습니다. http://lts.online.fr/dev/java/math.evaluator/
예에서 사용할 수있는 API가
JUEL은 명시 적으로 JSP에 연결하지 않고 Java의 통합 표현 언어를 구현합니다. 여기에 Quick Start guide의 표현식 평가 (해당 페이지의 # 3)가 관심있는 부분입니다.
또는 Spring 3.0은 고유 한 (다소 유사하지만) 표현 언어를 제공합니다. 이 옵션은 Spring을 이미 사용하고있는 경우에만 의미가 있습니다. EL에서는 사용하지 않을 것입니다.
Apache Commons Jexl을 사용하십시오. 이는 그러한 요구 사항을 위해 정확하게 설계된 것입니다.
:
MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println(m.getValue());
적어도이 글을 쓰는 시점에서는이 링크가 작동하지 않는 것 같습니다. 또한이 라이브러리는 비교 연산자와 OP와 같은 'boolean'값을 지원합니까? – andr
오픈 소스 구현을 위해 http://code.google.com/p/xpressionengine/ 시도가
식 평가 프레임 워크
정보 페이지에 대한 최신 자료입니다 은 (는) http://expressionoasis.vedantatree.com/
입니다.여기에 나열된 라이브러리가 내 요구에 너무 복잡하다는 사실을 발견했습니다.내가 Fscript 사용 결국 : jexl (http://commons.apache.org/jexl/)를 사용하여 http://fscript.sourceforge.net/
, 당신은 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));
jexl에서 내가 가진 한 가지 문제는 우선 순위 결정이었습니다. 나는 내가 평가할 필요가있는 경우가있다. || &&를 평가하기 전에. 따라서 위 식은 (a || b) && (c && d)가됩니다. jexl에서 'a'라는 컨텍스트를 사용하면 true로 평가됩니다. – Joseph
참조 용 :'(a || b) && (c && d)'라는 표현으로 예제를 시도했지만 수정 된 것 같습니다. 그냥 'a'는 '거짓'으로 평가됩니다. – membersound
같이이 작업을 수행 할 수 http://docs.codehaus.org/display/JANINO/Home (http://docs.codehaus.org/display/JANINO/Basic에서 촬영) 등을 사용하는 것은 매우 간단하다 :
이 라이브러리를 사용해 볼 수 있습니다. 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();
+1 어떻게 사용했는지 보여주는 좋은 예입니다. http://commons.apache.org/jexl/reference/examples.html – blak3r