请教, Java 对一个字符串进行加减乘除的运算的小小问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
13192262269
V2EX    程序员

请教, Java 对一个字符串进行加减乘除的运算的小小问题

  •  
  •   13192262269 2019-04-15 09:27:57 +08:00 4137 次点击
    这是一个创建于 2373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有什么函数,表达式可以直接用的?
    如:String s = "( 1+2*3 )-10/2";
    结果:2
    24 条回复    2019-04-17 14:18:43 +08:00
    akiakiseofficial
        1
    akiakiseofficial  
       2019-04-15 09:34:04 +08:00 via iPhone
    据我所知没有,但是你可以搜一搜 中缀表达式转后缀表达式 和 后缀表达式求解。
    cnzjl
        2
    cnzjl  
       2019-04-15 09:34:09 +08:00
    String s = Integer.toString((1+2*3 )-10/2);
    AlisaDestiny
        3
    AlisaDestiny  
       2019-04-15 09:34:57 +08:00   1
    chocotan
        4
    chocotan  
       2019-04-15 09:36:38 +08:00   1
    lihongjie0209
        5
    lihongjie0209  
       2019-04-15 09:38:24 +08:00   1
    直接调用 Javascript 执行引擎?
    sigup
        6
    sigup  
       2019-04-15 09:42:41 +08:00
    ```java
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("Javascript");
    System.out.println(engine.eval("(1+2*3)-10/2"));

    ```
    不过要做好校验,否则就是后门了
    hoosin
        7
    hoosin  
       2019-04-15 09:55:10 +08:00
    @lihongjie0209 Javascript eval 有安全问题,所以约等于废弃了
    HuHui
        8
    HuHui  
       2019-04-15 10:02:36 +08:00 via Android
    jexl 完全满足
    loveCoding
        9
    loveCoding  
       2019-04-15 10:16:36 +08:00
    看看这个库
    org.apache.commons:commons-jexl3
    loveCoding
        10
    loveCoding  
       2019-04-15 10:16:46 +08:00
    @HuHui 没看到你已经发了
    lihongjie0209
        11
    lihongjie0209  
       2019-04-15 10:17:48 +08:00
    @hoosin
    考虑一下 el 表达式?
    或者 eval 之前做过滤?
    或者可以设置 js 执行引擎的权限?
    lihongjie0209
        12
    lihongjie0209  
       2019-04-15 10:19:37 +08:00
    @hoosin 或者是内嵌一个 groovy 引擎?
    BBCCBB
        13
    BBCCBB  
       2019-04-15 10:23:56 +08:00
    spring 的 spel 模块也可以
    nekoneko
        14
    nekoneko  
       2019-04-15 11:30:16 +08:00
    可以考虑自己做一个做计算的方法。算法可以参考逆波兰式
    rizon
        15
    rizon  
       2019-04-15 11:38:50 +08:00
    四则运算调用 js 引擎处理也是个选择,甚至通过跑 sql 来计算也是可以的。。
    不过常规来说,四则运算解析工具类应该也很多吧。
    rizon
        16
    rizon  
       2019-04-15 11:43:35 +08:00
    stevenbipt
        17
    stevenbipt  
       2019-04-15 11:54:10 +08:00 via Android   1
    不行自己用两个栈写一个
    jlhde123
        18
    jlhde123  
       2019-04-15 12:37:15 +08:00
    ANTRL4
    liujan
        19
    liujan  
       2019-04-15 12:52:21 +08:00
    qlexpresss 试下,阿里出的
    jinue9900
        20
    jinue9900  
       2019-04-15 13:48:21 +08:00
    groovy 可以只要把双引号去掉就 Ok 了
    9684xtpa
        21
    9684xtpa  
       2019-04-15 14:01:47 +08:00
    ![]( )
    用 MVEL 也行
    mrsatangel
        22
    mrsatangel  
       2019-04-15 16:35:21 +08:00
    推一把 killme2008 的 aviator https://github.com/killme2008/aviator
    13192262269
        23
    13192262269  
    OP
       2019-04-16 13:43:03 +08:00
    @AlisaDestiny #3 请问一下,你是怎样搜出来的?我百度输入“ java eval 函数”,找不到这个链接,是必须是要先翻译成英文再搜索吗?
    m2276699
        24
    m2276699  
       2019-04-17 14:18:43 +08:00
    sql?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5921 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:12 PVG 14:12 LAX 23:12 JFK 02:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86