正则表达式,变量值动态替换

需求,实现表达式的计算

例子:
输入: 表达式字符串“200 * 50% + 金额”, 变量:金额 = 100。
输出:200.0

解决方案:采用阿里开源的轻量表达式引擎Aviator实现


        
            com.googlecode.aviator
            aviator
            5.2.5
        
       public static void main(String[] args) {
        String expr = "200 * 50% + 金额";
        Double execute = (Double) AviatorEvaluator.execute(expr, Collections.singletonMap("金额", 100));
        System.out.println(execute);
    }

## 坑,报错了,原来Aviator不支持百分号
Exception in thread "main" com.googlecode.aviator.exception.ExpressionSyntaxErrorException: Syntax error: invalid token at 10, lineNumber: 1, token : [type='Char',lexeme='+',index=10],
while parsing expression: `
200 * 50% + 金额^^^

正则表达式,处理一下百分号,把50%替换为0.5

    /**
     * JAVA转义符要双斜杠\\表示
     * 括号表示分组,我们要提取group(1)数字,不要百分号符号
     * \\.?表示可能会出现分数,?表示出现0或者1次
     */
    private static final Pattern PATTERN = Pattern.compile("(\\d+\\.?\\d+)\\%");
    public static void main(String[] args) {
        String expr = "200 * 50% + 金额";
        Matcher m = PATTERN.matcher(expr);
        String matchedText = "";
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            matchedText = m.group(1);
            float num = Float.parseFloat(matchedText) / 100f;
            //字符串replace
            m.appendReplacement(sb, String.valueOf(num));
        }
        //剩下的字符串append
        m.appendTail(sb);
        //传入变量
        Double execute = (Double) AviatorEvaluator.execute(sb.toString(), Collections.singletonMap("金额", 100));
        System.out.println(execute);
    }

// 打印200.0成功

你可能感兴趣的:(正则表达式,变量值动态替换)