Perl正则表达式:问号不是贪婪匹配

时间:2010-09-23 08:42:48

标签: regex perl

$var = 'about/';
$var =~ s/^(.*)\/?$/index.php?action=$1/;

我希望它匹配并替换尾部斜杠。但事实并非如此,我得到了这个结果:

index.php?action=about/

我做错了什么?我已经尝试将它包装在括号(\/)?中,并在括号(\/?)中包含问号。不包括前面的正斜杠显然对我没有任何好处。那么当它在那里时,怎么能让它吃掉斜线?

3 个答案:

答案 0 :(得分:11)

你的问题是,.*也是贪婪的。尝试使用.*?

Regex引擎首先尽可能扩展.*,然后检查正则表达式是否可以匹配输入。在你的情况下,它确实如此,因为尾部斜杠是可选的。然后回家满意。

答案 1 :(得分:4)

.*不明白:

$var = 'about/';
$var =~ s!^(.*?)/?$!index.php?action=$1!;

答案 2 :(得分:0)

在您的替换中,您正在努力指定您保留的内容。在这种情况下,更容易摆脱你不想要的东西。当某个功能似乎难以用于您的应用程序时,这表明您使用了错误的功能。

看起来你要做的是删除字符串中的最后一个/。所以,只需删除最后一个/:

 my $path = 'about/';
 $path = s|/\z||;

 my $action = "index.php?action=$path";

如果你真的想这样做(一个可疑的目标),你可以这样做:

 ( my $action = "index.php?action=$path" ) =~ s|/\z||;