Perl:围绕数学表达式的字符串操作

时间:2010-11-25 14:29:33

标签: regex perl string mathematical-expressions surround

我在学习Perl,我想包围一个像这样的表达式

function1(mathematical_expresion1)*function2(mathematical_expresion2)

其中'function1'和'function2'可以是任何单词并将数字组合在一起,例如function1可以是fun3dec,fun4nels,factor9或者其他...... 所以我的代码将成为这个

surrounded(function1(mathematical_expresion1)*function2(mathematical_expresion2))surroundedend

其中包围和surroundedend是字符串链。

所以如果我有这样的表达式:

exp(-49/200)-exp(-49/200)*(x-49/200)+1/2*exp(-49/200)*(x-49/200)^2-1/6*exp(-49/200)*(x-49/200)^3+1/24*exp(-49/200)*(x-49/200)^4-1/120*exp(-49/200)*(x-49/200)^5+1/720*exp(-49/200)*(x-49/200)^6-1/5040*exp(-49/200)*(x-49/200)^7+1/40320*exp(-49/200)*(x-49/200)^8-1/362880*exp(-49/200)*(x-49/200)^9+1/3628800*exp(-49/200)*(x-49/200)^10-1/39916800*exp(-49/200)*(x-49/200)^11+1/479001600*exp(-49/200)*(x-49/200)^12

我可以在前一个表达式中围绕两个术语的所有乘法。

谢谢你教我Perl!

1 个答案:

答案 0 :(得分:1)

这是第一个(不完整的)解决方案,它提出了一些关于你想做什么的问题:

为了简洁起见,我使用了更简单的语法 - 函数的参数是简单的数字或表达式。函数名称是单个字母。环绕声由S{}取代。不过,很容易从这个扩展到你的例子。

sample.txt的:

 1  A(1)
 2  A(1)*B(2)
 3  C(2)+A(1)*B(2)
 4  C(A(1)*B(2))
 5  C(A(1)*B(3)+C(4))
 6  A(1)*B(2)+C(3)*D(4)
 7  A(1)*B(2)*C(3)*D(4)
 8  A(B(2)*C(3))*D(4)
 9  C(A(1)+B(3))*C(4)

perl < sample.txt -pe 's/(\w\(\d+\)\*\w\(\d+\))/S{\1}/g'

 1  A(1)
 2  S{A(1)*B(2)}
 3  C(2)+S{A(1)*B(2)}
 4  C(S{A(1)*B(2)})
 5  C(S{A(1)*B(3)}+C(4))
 6  S{A(1)*B(2)}+S{C(3)*D(4)}
 7  S{A(1)*B(2)}*S{C(3)*D(4)}
 8  A(S{B(2)*C(3)})*D(4)
 9  C(A(1)+B(3))*C(4)

那么,第7行应该做什么?第8行应该做什么?

第9行不起作用,因为我的代码不够智能,我不知道你是否需要它工作。


我建议你真的需要一个解析器(例如yacc)和一个词法分析器。 Perl中有一个词法分析器,但不是解析器。

这里的问题是您正在搜索以下实例:

<expression> `*` <expression>

但由于表达式定义为

<expression> = \d+
             | <function>
             | <expression> <op> <expression>

您需要push down automaton才能使其正常运行。 Perl正则表达式就是不能这样做。

注意:自我的编译课程开始已有十年了,所以我的术语可能有些不稳定。