文档章节

jexl表达式解析、计算工具类.md

北京起航
 北京起航
发布于 2015/06/11 19:45
字数 421
阅读 2.8K
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

jexl表达式解析、计算工具类.md 根据表达式可以动态反向解析出变量;适合动态表达式,参数未知场景 如 (A0.2+B0.8)/C 解析出 A\B\C,把ABC参数值代入计算 初始化引擎

private static final JexlEngine ENGINE = new JexlEngine();
static {
    ENGINE.setCache(512);
    ENGINE.setLenient(false);
    ENGINE.setSilent(false);
}

解析出表达式中的变量 ExpressionUtils

package com.its.cloud.utils;
 
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
 
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.ExpressionImpl;
import org.apache.commons.jexl2.JexlEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.Collections;
import java.util.List;
import java.util.Set;
 
/**
* Created by hongliangpan@gmail.com on 2015/1/19.
*/
public class ExpressionUtils {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(ExpressionUtils.class);
    private static final JexlEngine JEXL = new JexlEngine();
 
    static {
        JEXL.setCache(512);
        JEXL.setLenient(false);
        JEXL.setSilent(false);
    }
 
    public static JexlEngine getJexlEngine() {
        return JEXL;
    }
 
    public static boolean isValidExpression(String expression) {
        try {
            JEXL.createExpression(expression);
            return true;
        } catch (Throwable t) {
            LOGGER.error("表达式{}配置错误{}。", expression, t.getMessage(), t);
            return false;
        }
    }
 
    /**
     * 获取表达式中的变量参数
     *
     * @param expression 表达式,如 ping.max>0 and ping.min>0 and pin.lost==0
     */
    public static List<String> getVariables(String expression) {
        Expression exp;
        try {
            exp = JEXL.createExpression(expression);
        } catch (Throwable t) {
            LOGGER.error("表达式{}配置错误{}。", expression, t.getMessage(), t);
            return Collections.emptyList();
        }
        return getVariables(exp);
    }
 
    public static List<String> getVariables(Expression exp) {
        List<String> metricDefIds = Lists.newArrayList();
        Set<List<String>> variables = JEXL.getVariables((ExpressionImpl) exp);
        for (List<String> var : variables) {
            metricDefIds.add(Joiner.on(".").join(var));
        }
        return metricDefIds;
    }
}

解析变量,调用示例

jexl反向解析表达式中的变量
JexlEngine jexl = new JexlEngine();
String threshold = "(value==3)and (cpu>90 and mem <70)";
Expression exp = jexl.createExpression(threshold);

List<String> variables = jexl.getVariables(((ExpressionImpl)exp));

表达式示例

String threshold = "value>90";
        Expression exp = getJexlEngine().createExpression(threshold);
        JexlContext jc = new MapContext();
        jc.set("value", data.getValue());
        Object evaluate = exp.evaluate(jc);
        if (evaluate instanceof Boolean) {
            return (boolean) evaluate;
        } else {
            LOGGER.error("表达式错误{},不是boolean返回值;{}", exp, rule);
            return false;
        }
北京起航
粉丝 59
博文 52
码字总数 29304
作品 0
海淀
架构师
私信 提问
加载中
请先登录后再评论。
jxls2.3-简明教程 excel

http://www.cnblogs.com/klguang/p/6425422.html http://jxls.sourceforge.net/ jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟...

壹峰
2018/05/03
271
0
Jxls第六章——表达式语言

1 概述 默认,Jxls使用Apache JEXL表达式语言计算Excel模板文件中的属性表达式。 2 自定义Jexl处理 如果你需要自定义Jexl处理,可以从Transformer获取JexlEngine引用并设置必须的配置。 例如...

Leech
2018/07/05
0
0
第三章——jXLS Excel标记

jXLS的Excel标记分为3种: Bean属性标记 区域标记 命令标记 jXLS提供XlsCommentAreaBuilder类从Excel单元格注释读取标记。XlsCommentAreaBuilder实现通用AreaBuilder接口。AreaBuilder接口如...

Leech
2018/07/13
1.2K
0
Java表达式计算实现

在做URule规则引擎PRO版时,遇到表达式计算问题,就是用户随意输入一个包含+、-、、/以及()的字符串表达式时,引擎要能根据表达式计算出结果,如果表达式中包含普通字符串,则以字符串连接方...

youseries
2018/07/04
226
0
Jxls第五章——Excel标记

Jxls的Excel标记分为3部分: Bean属性标记 区域定义标记 命令定义标记 Jxls提供XlsCommentAreaBuilder类可以从Excel单元格注释读取标记。XlsCommentAreaBuilder实现通用AreaBuilder接口。 这...

Leech
2018/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
9分钟前
0
0
如何在Django视图中合并两个或多个查询集? - How to combine two or more querysets in a Django view?

问题: I am trying to build the search for a Django site I am building, and in that search, I am searching in 3 different models. 我正在尝试搜索要构建的Django网站,在该搜索中,我......

javail
16分钟前
0
0
PHP解析/语法错误; 以及如何解决它们? - PHP parse/syntax errors; and how to solve them?

问题: Everyone runs into syntax errors. 每个人都遇到语法错误。 Even experienced programmers make typos. 即使是经验丰富的程序员也会打错字。 For newcomers, it's just part of the......

fyin1314
今天
20
0
OSChina 周三乱弹 —— 公主是大王的,命是自己的。小怪也要养家糊口啊!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :郭燕的单曲《下半生》 最近听一些轻快的歌 #今日歌曲推荐# 《下半生》 - 郭燕 手机党少年们想听歌,请使劲儿戳(这里) @锦年 :...

小小编辑
今天
38
0
263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
今天
68
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部