比如

select ' 1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)-1 ' col ,1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)-1 result

\

现在的需求式 给你一个字符串如上述col 你要算出result。

前提式 只有+和-的运算,而且只有嵌套一次 -(4-3)没有 -(-4+(3-(3+1)))嵌套多次。

第一步我们需要将运算拆分为每一个单独的计算例如上述拆分为

1

+(2-3)

+(4.1-3.1)

-(4-3)

-(-3.3+4.3)

-1

这几部分,然后记住前面的符号,

第二部再将这几部分中的计算再拆分。

例如 +(2-3) 拆分为2 +  -3

-(4-3) 差分为 4-3结果为 4 +  -3 因为括号前面是负号 改为 negtive(4) +negtive(-3)。

总体思路就是将每一个单独的数字得出其正负,然后所有数字相加。

涉及到的语法有 lateral view 一行变多行

split 如何拆分整个算式。

substring/translate去除掉括号

其中最难点在于split。

第一步如何split? 我们将一个表达式拆分

'1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11' 如何拆分为下面的数组

["1","+(2-3)","+(-4.1-3.1)","+13","-(4-3)","-(-3.3+4.3),-11"]

我们首先根据什么split? + - 还是+(  ,)-

说实话这个玩意是真的难写。

select split( '1+(2-3)+(-4.1-3.1)-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())')

结果 ["1","+(2-3)","+(-4.1-3.1)","-(4-3)","-(-3.3+4.3)"]

看着好像是全部拆分了,以为没问题的时候,又发现了问题

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())')

结果 ["1","+(2-3)","+(-4.1-3.1)+3","-(4-3)","-(-3.3+4.3)"]

这里这个+3没有单独的分组

经过改进

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+[\\-\\+])')

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)"]

然后又发现了问题

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)+11','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+[\\-\\+])')

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)+11"]

--说实话这个b正则式真难写

最后为

select split( '1+(2-3)+(-4.1-3.1)+3-(4-3)-(-3.3+4.3)-11','(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+($|[\\+\\-]))')

["1","+(2-3)","+(-4.1-3.1)","+3","-(4-3)","-(-3.3+4.3)","-11"]

接着是要拆分括号里的计算

select split( a ,'(?=[+-]\\d)')
from (
         select '1+2+3' a  union all select '1-2+3' union all select '-1-1-3'
         )t

select sum(`if`(is_positive,replace(tmp.res,'+',''),negative(tmp.res)))
from (
                  select t.a,
                         substr(t.a, instr(t.a, '(') + 1, `if`(t.a not like '%(%',
                                                               length(t.a),
                                                               instr(t.a, ')') - instr(t.a, '(') - 1
                             )) res,
                         instr(t.a, ')'),
                         instr(t.a, '('),
                         is_positive
                  from (
                           select t.a a, `if`(substr(a, 1, 1) = '-' and  locate('(',a)>0, false, true) is_positive
                           from (select explode(split('1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11',
                                                      '(?=([\\-\\+]\\())|(?=[\\-\\+]\\d+($|[\\+\\-]))')) a) t
                       ) t
              )t lateral view  explode(split(t.res,'(?=[+-]\\d)'))tmp as res

select 1+(2-3)+(-4.1-3.1)+13-(4-3)-(-3.3+4.3)-11

结果有点误差因为是string是看作float去计算的 所以有误差,cast as decimal就好了

hive中如何计算字符串中表达式相关推荐

  1. 如何计算字符串中出现的字符串?

    如何计算特定字符串在另一个字符串中出现的次数. 例如,这就是我要使用Javascript进行的操作: var temp = "This is a string."; alert(t ...

  2. java 判断 中文字符_java中判断字符串中是否有中文字符

    package com.meritit.test; public class TestChart { public static void main(String[] args) throws Exc ...

  3. 如何在PHP中删除字符串中的所有空格? [重复]

    本文翻译自:How do I strip all spaces out of a string in PHP? [duplicate] Possible Duplicate: 可能重复: To str ...

  4. python删除字符串中的字母_在Python中删除字符串中的大写字母

    我想写一个函数消除一个字符串和2个可选参数.第一个可选参数(bad_characters)取一个字母,第三个参数(case_sensitive)取一个布尔值.该函数应该接受一个字符串s并移除bad_c ...

  5. java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现

    使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现. 假设以下是我们的字符串.String myStr = "Amit Diwan"; 在上面的字符串中 ...

  6. 从Google表格中的字符串中提取多个特定长度的数字子串的解决思路

    问题描述: 我只需要从Google 表格中的字符串中拆分或提取由 8 位数字组成的数字. 我尝试过SPLITorREGEXREPLACE但我找不到只获取该长度的数字的方法,我只获取字符串中的所有数字! ...

  7. java字符串确定汉字_java中判断字符串中汉字的个数

    使用方法3与方法4时需要注意一些问题,代码中会有注释. 代码如下: package 包名; import java.util.ArrayList; import java.util.regex.Mat ...

  8. python中判断字符串中出现次数最多的字母

    python中判断字符串中出现次数最多的字母 import string def check(text):text = text.lower()return max(string.ascii_lowe ...

  9. python字符串去掉空行_从python中的字符串中删除空格

    python字符串去掉空行 如何在python中删除字符串中的空格 (How to remove whitespaces in a string in python) str.lstrip()str. ...

最新文章

  1. Android使用ViewPager实现左右循环滑动及轮播效果
  2. 互联网 DBA 需要做那些事(转)
  3. 7-1 活动选择问题 (25 分)(思路+详解+扩展)宝 今天你AC了吗!!!
  4. python学习中遇到的问题
  5. 17商品推荐系统项目框架
  6. redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析
  7. 微机原理换行代码_微机原理
  8. 定时器(setTimeout/setInterval)调用带参函数失效解决方法
  9. IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu)
  10. php在线售卡系统,云尚在线发卡系统PHP源码|专门为个人或小型企业提供在线售卡,订单处理系统...
  11. 【VLAN配置及具体解析(基于接口的VLAN划分-access、trunk和hybrid,基于Mac地址的VLAN划分)】-20211201
  12. windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
  13. foxmail远程主机强迫关闭了一个现有的连接
  14. Visual C++ 11 中新的并发功能
  15. ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
  16. 【数据分析师_02_SQL+MySQL】022_MySQL的全文检索(MyISAM,MATCH AGAINST)
  17. uIP TCP/IP协议栈
  18. ESP32 ESP-IDF 项目文件结构
  19. 5800日常操作使用小技巧
  20. B S架构 服务器虚拟化,基于KVM的B/S架构虚拟化管理系统

热门文章

  1. Laravel Onion洋葱模型
  2. Windows程序设计入门教程[来自邪恶八进制信息安全团队(www.eviloctal.com)]
  3. 第一章 数据库的创建
  4. 苹果震撼发布首款头显,搭配强悍Mac和iOS 17等全新产品,价值25000元!
  5. 12306抢票,极限并发带来的思考
  6. php面向对象编写计算器,使用面向对象的图形计算器
  7. minio常见问题处理
  8. vue json可视化编辑器 vue-json-editor
  9. Elastic与阿里云助力汽车及出行产业数字化转型
  10. 音视频播放器与 H.265 播放探索