• ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字


    昨天工作中遇到这个问题:

    有一个这样的字符串expression变量,里面可能存储的值类似于以下
    [Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1]

    [300,1]/[PROCOST,$0]

    给定另外一个整数常量 step
    现在想用正则表达式,把expression中的,所有紧接着逗号之后的数字加上step,例如
    如果step等于1 那么第一个应该得出[Index_CivilWork,1]*(1+[Y10814,2])/[Y10674,2],第二个应该得出
    [300,2]/[PROCOST,$0]

    我的解决方法:

    create or replace function f_get_nebformula(expression in varchar2, step in pls_integer)
    return varchar2 is


          i_l_commas pls_integer;   --表达式中的逗号个数
          i_l_dollars pls_integer;  --表达式中的货币符号个数
          str_result varchar2(2000);
          i_l_strpos pls_integer;
          i_l_endpos pls_integer;
          i_l_laststrpos pls_integer;
          i_l_lastendpos pls_integer;
          i_l_number pls_integer;
         
    begin

        i_l_commas := length(regexp_replace(REPLACE(expression, ',', '@'), '[^@]+',''));
        i_l_dollars := (length(expression)-length(replace(expression,'$','')))/length('$');
        str_result := '';

        --解析表达式
        for i in 1 .. i_l_commas-i_l_dollars loop
            i_l_strpos := regexp_instr(expression, ',[[:digit:]]', 1, i)+1;  --第i个数字起始下标的位置
            i_l_endpos := i_l_strpos + length(regexp_substr(expression, ',[[:digit:]]+', 1, i))-2;  --第i个数字结束下标
            i_l_number := substr(expression, i_l_strpos, i_l_endpos-i_l_strpos+1)+ step;
           
            if i = 1 then
              i_l_laststrpos := 0;
              i_l_lastendpos := 0;
            else
              i_l_laststrpos := regexp_instr(expression, ',[[:digit:]]', 1, i-1)+1;  --查找前一次模式的数字起始下标
              i_l_lastendpos := i_l_laststrpos + length(regexp_substr(expression, ',[[:digit:]]+', 1, i-1))-2;  --查找前一次模式的数字结束下标
            end if;

            --组装字符串
            str_result := str_result || substr(expression, i_l_lastendpos+1, i_l_strpos-i_l_lastendpos-1)||i_l_number;
        end loop;
       
        --组装最后一段字符串
        str_result := str_result || substr(expression, i_l_endpos+1, length(expression));

        return(str_result);
    end f_get_nebformula;

  • 相关阅读:
    Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
    IOC的优点是什么?
    《精益软件开发管理之道》阅读笔记02
    每日日报18
    每日日报17
    ecplise中没有Java Application的解决办法
    HTML+CSS+div 制作简单的登录界面
    HTML+CSS:通过li标签制作导航条
    每日日报16
    用Python爬取最新疫情数据(使用PyCharm)
  • 原文地址:https://www.cnblogs.com/zheng-hong-bo/p/3445511.html
Copyright © 2020-2023  润新知