正則表達(dá)式,變量值動(dòng)態(tài)替換

需求,實(shí)現(xiàn)表達(dá)式的計(jì)算

例子:
輸入: 表達(dá)式字符串“200 * 50% + 金額”, 變量:金額 = 100。
輸出:200.0

解決方案:采用阿里開源的輕量表達(dá)式引擎Aviator實(shí)現(xiàn)

<!-- 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);
    }

## 坑,報(bào)錯(cuò)了,原來Aviator不支持百分號(hào)
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% + 金額^^^

正則表達(dá)式,處理一下百分號(hào),把50%替換為0.5

    /**
     * JAVA轉(zhuǎn)義符要雙斜杠\\表示
     * 括號(hào)表示分組,我們要提取group(1)數(shù)字,不要百分號(hào)符號(hào)
     * \\.?表示可能會(huì)出現(xiàn)分?jǐn)?shù),?表示出現(xiàn)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));
        }
        //剩下的字符串a(chǎn)ppend
        m.appendTail(sb);
        //傳入變量
        Double execute = (Double) AviatorEvaluator.execute(sb.toString(), Collections.singletonMap("金額", 100));
        System.out.println(execute);
    }

// 打印200.0成功
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 概述 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法,有點(diǎn)像字符...
    JRG_Orange閱讀 2,711評(píng)論 0 50
  • 簡介 通過使用正則表達(dá)式,可以: 測試字符串內(nèi)的模式。例如,可以測試輸入字符串,以查看字符串內(nèi)是否出現(xiàn)電話號(hào)碼模式...
    HEY_439閱讀 838評(píng)論 0 0
  • 正則表達(dá)式概述 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法,有點(diǎn)像...
    釋夢(mèng)石閱讀 397評(píng)論 0 0
  • 前幾天線上一個(gè)項(xiàng)目監(jiān)控信息突然報(bào)告異常,上到機(jī)器上后查看相關(guān)資源的使用情況,發(fā)現(xiàn) CPU 利用率將近 100%。通...
    java菜閱讀 411評(píng)論 0 0
  • 前幾天線上一個(gè)項(xiàng)目監(jiān)控信息突然報(bào)告異常,上到機(jī)器上后查看相關(guān)資源的使用情況,發(fā)現(xiàn) CPU 利用率將近 100%。通...
    溫柔的傾訴閱讀 366評(píng)論 0 0

友情鏈接更多精彩內(nèi)容