用* pow(b,N)替换a * b ** N

时间:2013-03-04 09:50:55

标签: regex vim

我有一个非常大的表达式,表达了**运算符的功能,需要将其转换为使用pow函数的代码。也就是说,我寻找一个正则表达式来查找和替换a*b**N*d之类的术语a*pow(b,N),其中N是一个整数。

此处,abc是可能包含xy*-+()和整数的字词,而a**d可能不是本。

我在某种程度上坚持逃避所有这些角色。我准备投入一些手动后处理,因此正则表达式应该是健壮的,但不一定完美。

编辑:正如肯特指出的那样,当b包含嵌套括号时存在困难。在我的情况下,没有嵌套括号。这些条款都是以下评论中给出的所有形式。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以尝试使用正则表达式分组来隔离要提取的类别:

所以这是正则表达式:

(a\*)(b)\*{2}(N)\*d

您可以像这样提取组:

\1pow(\2,\3)

参考组是:

\1 = (a\*)
\2 = (b)
\3 = (N)

答案 1 :(得分:1)

你可以试试这个

正则表达式:(\([0-9xy*-]+\)|[0-9xy]+)\*\*([0-9]+)

替换为:pow($1,$2)pow(\1,\2)

答案 2 :(得分:1)

似乎这个问题通常无法通过正则表达式解决,因为你需要以某种方式平衡parens - 这是解析器的任务。

这样的事情可以完成没有任何事情的工作: %s/\(x\|y\|\d\+\)\*\*\(\d\+\)/pow(\1,\2)/gc

类似这样的话,如果这个词周围只有一对parens: %s/\(([xy0-9+-\* ]\+)\|x\|y\|\d\+\)\*\*\(\d\+\)/pow(\1,\2)/gc

BTW它让我想起this一点问题=)