$var = 'about/';
$var =~ s/^(.*)\/?$/index.php?action=$1/;
我希望它匹配并替换尾部斜杠。但事实并非如此,我得到了这个结果:
index.php?action=about/
我做错了什么?我已经尝试将它包装在括号(\/)?
中,并在括号(\/?)
中包含问号。不包括前面的正斜杠显然对我没有任何好处。那么当它在那里时,怎么能让它吃掉斜线?
答案 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||;