V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
13192262269
V2EX  ›  程序员

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

  •  
  •   13192262269 · 2019-04-15 09:27:57 +08:00 · 3777 次点击
    这是一个创建于 2084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有什么函数,表达式可以直接用的?
    如:String s = "( 1+2*3 )-10/2";
    结果:2
    24 条回复    2019-04-17 14:18:43 +08:00
    xlui
        1
    xlui  
       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   ·   实用小工具   ·   1449 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.