首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

这个正则表达式如何写

2012-03-14 
这个正则表达式怎么写?匹配下面定义的算术表达式exp:expnumberexp(exp)expexpopexp要求用“递归引用”来

这个正则表达式怎么写?
匹配下面定义的算术表达式exp:
exp=number
exp=(exp)
exp=exp   op   exp
要求用“递归引用”来匹配!!!
另外希望知道‘递归引用’的详细规则,或者提供点资料也行。


[解决办法]
$exp = '6/(1+2) ';

$re = qr{\d+|\((??{$re})\)|(??{$re})(?:\+|\-|\*|\/)(??{$re})};

$exp =~ /^$re$/;

没处理空格。

见 http://perldoc.perl.org/perlre.html , (??{ code }) 一条。

[解决办法]
对于一些例子iambic 的表达式会递归而最终栈溢出. 递归在第二个(??{$re}). 因为匹配这个的时候并没有吃进任何符号而继续调用该表达式.
调整一下匹配规则就可以了
$exp = '6/(1+(2))+8 ';

$re = qr{
(\d+ |
\((??{$re})\))
([+\-*/](??{$re}))?
}x;

if($exp =~ /^$re$/) {
print "Matched\n ";
} else {
print "Not matched\n ";
}
当然这里也没有考虑空格和算符号的优先级

热点排行