在源代码中我必须阅读(不是来自我)我发现了一个没有按预期工作的正则表达式(或者至少它代码没有按照它应该做的那样)。
正则表达式的想法是确保它处理的字符串在之后的结尾只有一个斜杠。
所以我们走了:
$string =~ s/\/*$/\//g; # Add a trailing slash
我把它读作“在字符串的末尾找到任意数量的斜杠(包括0)并用一个斜杠替换它们”。但事实并非如此。
正则表达式加倍一个/多个现有的尾部斜杠。所以如果已经存在一个或多个,我最终会得到两个斜杠。如果没有,我会得到一个(因为这是想法)。
我可以使用Regex tester重现它。只需在顶部框中输入http://example.com/foo/(并在结尾处使用不同的斜杠计数进行更改),在第二个中输入正则表达式,将“/”作为替换模式,然后点击“发送”。
它似乎围绕正则表达式也用斜杠替换“没有”(或行结束?)(所以它用一个斜杠替换“没有”和现有斜杠用一个斜杠代替两个斜杠我见...)。
我用过
$string =~ s/\/{1,0}$/\//g; # Add a trailing slash
但也只有在从头开始至少有一个斜杠时才有效。
修改
万一有人想知道:
$string =~ s/\/*\z/\//g; # Add a trailing slash
产生同样的事情。
答案 0 :(得分:5)
问题是/g
修饰符,它表示替换所有出现的内容。当你在字符串的末尾有一个斜杠时,Perl会进行两次替换。首先,它用另一个斜杠替换斜杠。然后(因为$
是零宽度断言,并且不消耗任何字符)它用斜杠替换末尾的空字符串。删除/g
它将起作用,因为只会替换第一个匹配项:
$string =~ s!/*$!/!; # Add a trailing slash
(我也更改了分隔符以使其更具可读性,尽管这与您的问题无关。)