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||;