【发布时间】:2012-02-19 22:19:43
【问题描述】:
在我必须阅读的源代码中(不是来自我的),我发现一个正则表达式没有按预期工作(或者至少代码没有按预期工作)。
正则表达式的想法是确保它处理的字符串之后正好有一个斜线。
所以我们开始:
$string =~ s/\/*$/\//g; # Add a trailing slash
我将其理解为“在字符串末尾找到任意数量的斜杠(包括 0)并用单个斜杠替换它们”。但事实并非如此。
正则表达式 doubles 一个/多个现有尾随斜杠。所以如果已经有一个或多个斜线,我最终会得到两个斜线。如果没有,我会得到一个(这就是想法)。
例如,我可以使用Regex tester 重现它。只需在顶部框中输入http://example.com/foo/(并在末尾使用不同的斜杠计数来改变它),第二个中的正则表达式,“/”作为替换模式,然后点击“发送”。
它似乎围绕着正则表达式,也用斜杠替换“无”(或行尾?)(所以它用一个斜杠替换“无”,用一个斜杠替换现有的斜杠,这弥补了我的两个斜杠见...)。
我用过
$string =~ s/\/{1,0}$/\//g; # Add a trailing slash
同样,但这仅在开头至少有一个斜线时才有效。
编辑
以防万一有人想知道:
$string =~ s/\/*\z/\//g; # Add a trailing slash
产生同样的东西。
【问题讨论】: