2013-03-04 155 views
2

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

这里,ab,和c是可以包含xy*-+()和整数和a**d可以不存在条款。

我以某种方式坚持逃避所有这些字符。我准备投入一些手动后处理,所以正则表达式应该是健壮的,但不一定是完美的。

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

+0

意思'A +(1 +( x *(mn))+ j)** p'将被转换成a + pow((i +(x *(mn))+ j),p)'? – Kent 2013-03-04 10:10:21

+1

我觉得这不是正则表达式的工作... – Kent 2013-03-04 10:15:58

+0

是的。然而,这些术语看起来像'4 * y ** 2 *( - 2 * x + 1)*( - y + 1)** 2'。你有什么建议? – Jan 2013-03-04 10:23:50

回答

1

好像这个问题不能笼统地用正则表达式来解决,因为你需要以某种方式平衡括号 - - 这是解析器的任务。

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

而且这样的事情,如果有可能只有一对周边术语括号的: %s/\(([xy0-9+-\* ]\+)\|x\|y\|\d\+\)\*\*\(\d\+\)/pow(\1,\2)/gc

BTW这让我想起this问题有点=)

+0

+1用于指出。 – Jan 2013-03-04 10:48:17

+0

谢谢,这个作品完美无瑕! – Jan 2013-03-04 12:50:21

1

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

因此,这是正则表达式:

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

您可以提取组,如下所示:

\1pow(\2,\3) 

参考组是:

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

谢谢,我会试试这个.. – Jan 2013-03-04 10:01:13

1

你可以试试这个

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

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

+0

谢谢,让我检查... – Jan 2013-03-04 10:00:40

+0

K,它的工作原理!我只需要省略这些加号并逃避()。但这可能是由于vim的“魔术”。 – Jan 2013-03-04 10:22:29

+1

这不适用于嵌套括号。例如在我的评论中。 @Jan你应该明确地定义,在你的真实文件中是什么情况,什么不是。顺便说一句,VIM有'非常魔法',这可以节省一些逃生。 – Kent 2013-03-04 10:29:18

相关问题