Regex Perl正则表达式:问号isn';不贪婪地匹配

Regex Perl正则表达式:问号isn';不贪婪地匹配,regex,perl,Regex,Perl,我希望它匹配并替换尾随斜杠。但事实并非如此,我得到的结果是: $var = 'about/'; $var =~ s/^(.*)\/?$/index.php?action=$1/; 我做错了什么?我试着把它用括号括起来,并在括号中加上问号。不包括前面的正斜杠显然对我没有任何好处。那我怎么才能让它吃到斜杠呢?你的问题是,*也很贪婪。尝试使用*? 正则表达式引擎首先尽可能地扩展*,然后检查正则表达式是否与输入匹配。在您的例子中,它是这样的,因为尾部斜杠是可选的。然后它满意地回家。使*解除冻结: in

我希望它匹配并替换尾随斜杠。但事实并非如此,我得到的结果是:

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

我做错了什么?我试着把它用括号括起来,并在括号中加上问号。不包括前面的正斜杠显然对我没有任何好处。那我怎么才能让它吃到斜杠呢?

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


正则表达式引擎首先尽可能地扩展
*
,然后检查正则表达式是否与输入匹配。在您的例子中,它是这样的,因为尾部斜杠是可选的。然后它满意地回家。

使
*
解除冻结:

index.php?action=about/

在替换中,您非常努力地指定保留的内容。在这种情况下,摆脱你不想要的东西要容易得多。当您的应用程序很难使用某个功能时,这表明您使用了错误的功能

看起来您要做的是删除字符串中的最后一个/。因此,只需删除最后一个/:

$var = 'about/';
$var =~ s!^(.*?)/?$!index.php?action=$1!;
如果你真的想做到这一点(一个可疑的目标),你可以这样做:

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

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

哦,当然。唉,RegEx总是给我带来麻烦,因为总有这样的东西会咬我的屁股。谢谢如果为包含斜杠的正则表达式选择不同的分隔符,您可能会发现代码更具可读性。我通常使用
,因为它在正则表达式中不常用。e、 g.
s^(.*)/?$!php?action=$1不完全是我想要做的。这是一个正则表达式,它最终将进入MOD_重写规则。这只是最终结果的一部分。我只是在Perl中逐段测试它,然后将它放在一起,这样我就知道当我最终将它放入htaccess文件时,它会做我想做的事情。当我发现自己浪费了时间,因为提问者遗漏了这样的重要信息时,我总是有点难过。
 ( my $action = "index.php?action=$path" ) =~ s|/\z||;