jdk1.8新特性之Nashorn JavaScript扩展

package com.test.nashornJavaScript;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.math.BigDecimal;

/**
 * java8新特性之七Nashorn JavaScript 出处:https://blog.csdn.net/wen901230zi/article/details/105388973
 * @auther zhangZhi
 * @create 2022-05-05 22:41
 */
public class NashornJavaScriptTest {
    public static void main(String[] args) {
        ScriptEngineManager scriptEngineManager=new ScriptEngineManager();
        ScriptEngine scriptEngine=scriptEngineManager.getEngineByName("nashorn");
        String name="测试JVM中javasScript eval()函数计算:";
        Object result =null;
        try {
            scriptEngine.eval("print('" + name + "')");
            result = scriptEngine.eval("5*3/(2+10)");
            System.out.println("方式1:" + result);
            result = scriptEngine.eval("x=10; y=20;(x*y);");
            System.out.println("方式2:" + result);
            result = scriptEngine.eval("A=1,B=2,C=3,A+B*C ");
            System.out.println("方式3:" + result);
            //方式4:项目中实际公式计算验证
            String a = "1.753";
            String b = "2.53";
            String c = "3.5455";
            String d = "4";
            String x = "5";
            String formula = "AX³+BX²+C*X+D";
            String replaceFormula = formula;
            replaceFormula = replaceFormula.replaceAll("X²","*X*X");
            replaceFormula = replaceFormula.replaceAll("X³","*X*X*X");
            replaceFormula = replaceStr(replaceFormula,"A", a);
            replaceFormula = replaceStr(replaceFormula,"B", b);
            replaceFormula = replaceStr(replaceFormula,"C", c);
            replaceFormula = replaceStr(replaceFormula,"D", d);
            replaceFormula = replaceStr(replaceFormula,"X", x);
            result = scriptEngine.eval(replaceFormula);
            if(null != result){
                BigDecimal bd = new BigDecimal(result.toString());
                bd = bd.stripTrailingZeros();
                result = bd.toPlainString();
            }
            System.out.println("方式4,原公式函数:" + formula + "\n转换后:" + replaceFormula + "\n计算结果:"+ result.toString());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("执行脚本错误: "+ e.getMessage());
        }

    }



    /**
     * 精确替换字符 防止出现 匹配A 时将AA匹配的情况
     */

    public static String replaceStr(String sourceStr,String replaceKey,String replaceValue){
        String replaceStrReg="";
        for(char str_char:replaceKey.toCharArray()){
            replaceStrReg+="[";
            replaceStrReg+=str_char;
            replaceStrReg+="]";
        }
        String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])";
        String endReg="([\\+\\-\\*/,(])"+replaceStrReg+"$";
        String reg="([^a-zA-Z])("+replaceStrReg+")"+"([^a-zA-Z])";
        String endStr=sourceStr;
        while(matcheStr(endStr,replaceKey)){
            endStr=endStr.replaceAll(startReg, replaceValue+"$1");
            endStr=endStr.replaceAll(reg, "$1"+replaceValue+"$3");
            endStr=endStr.replaceAll(endReg, "$1"+replaceValue);
        }
        return endStr;
    }


    /**
     * 精确匹配字符 防止出现 匹配A 时将AA匹配的情况
     */
    public static Boolean matcheStr(String sourceStr,String matchStr){
        String replaceStrReg="";
        for(char str_char:matchStr.toCharArray()){
            replaceStrReg+="[";
            replaceStrReg+=str_char;
            replaceStrReg+="]";
        }
        String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])[\\s\\S]*";
        String endReg="[\\s\\S]*([\\+\\-\\*/,(])"+replaceStrReg+"$";
        String reg="[\\s\\S]*([^A-Za-z])("+replaceStrReg+")"+"([^A-Za-z])[\\s\\S]*";
        if(sourceStr.matches(startReg)||sourceStr.matches(reg)||sourceStr.matches(endReg)){
            return true;
        }else{
            return false;
        }
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值