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

需求,实现表达式的计算

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

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

<!-- pom.xml-->
        <dependency>
            <groupId>com.googlecode.aviator</groupId>
            <artifactId>aviator</artifactId>
            <version>5.2.5</version>
        </dependency>
       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成功
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 概述 正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符...
    JRG_Orange阅读 2,617评论 0 50
  • 简介 通过使用正则表达式,可以: 测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式...
    HEY_439阅读 711评论 0 0
  • 正则表达式概述 正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像...
    释梦石阅读 347评论 0 0
  • 前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通...
    java菜阅读 392评论 0 0
  • 前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通...
    温柔的倾诉阅读 356评论 0 0