这个正则表达式怎么写?
匹配下面定义的算术表达式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 ";
}
当然这里也没有考虑空格和算符号的优先级