美文网首页
正则表达式,变量值动态替换

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

作者: 哲人王 | 来源:发表于2021-05-22 15:33 被阅读0次

    需求,实现表达式的计算

    例子:
    输入: 表达式字符串“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成功
    

    相关文章

      网友评论

          本文标题:正则表达式,变量值动态替换

          本文链接:https://www.haomeiwen.com/subject/dsgykltx.html