读书人

这个正则表达式如何写

发布时间: 2012-03-14 12:01:13 作者: rapoo

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

读书人网 >perl python

热点推荐