代码之家  ›  专栏  ›  技术社区  ›  Alex

查找并替换方程(regex?)

  •  3
  • Alex  · 技术社区  · 14 年前

    我正在将一些Excel公式转换为另一个系统,需要做一些相当漂亮的搜索并替换magic。在这种情况下,我认为regex是工作的工具,但是如果有人有其他想法,我想听听。

    我正在努力将这些公式转换成类似于SQL语法的东西。我还必须处理代数符号,因此我可能有以下内容:

    9^2将需要成为权力(9,2)。 (A+3)^3将需要成为权力((A+3),3)。

    最好的方法是什么?

    我用的是C 3.5,如果这有区别的话。

    编辑:我必须分析的一个示例(幂符号接近尾端):

    "((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000) * (({VAL(9286)} / 22.4)*34.38 + {VAL(9609)} + {VAL(6480)}) * ((1.075068 + 0.001*11.17019 * ((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000)+273.15)) + (100000*0.90755 / ((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000) + 273.15)^2))*4.1868/32)"
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   kennytm    14 年前

    由于嵌套括号的可能性,regex不是此任务的合适工具。最好使用数学表达式解析器。

    但这并非不可能。例如,通过 反复地 替换图案

    ((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O1>)|\)(?<-O1>))*(?(O1)(?!))\))?)\s*\^\s*((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O2>)|\)(?<-O2>))*(?(O2)(?!))\))?)

    具有

    "POWER($1,$2)"
    

    在字符串不改变之前,它应该能够 a^b 进入之内 POWER(a,b) . 例子:

       (a+3)^(b+5^(c+3)) + 9 ^ 2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3)
    -> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((5^7),(6^(8^9-1)-3))
    -> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3))
    -> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3))
    -> done
    

    请注意,此regex将假定 ^ 是左关联而不是右关联。

       1^2^3
    -> POWER(1,2)^3
    -> POWER(POWER(1,2),3)
    -> done
    

    虽然1^2^3本身的格式不正确。