【问题标题】:Perl regex meant to add trailing slash if there is none doubles existing slashPerl 正则表达式意味着如果没有双斜杠,则添加尾随斜杠
【发布时间】: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

产生同样的东西。

这是direct link to the test page

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    问题在于 /g 修饰符,它表示要替换所有出现的情况。当字符串末尾有斜线时,Perl 会进行两次替换。首先,它用另一个斜线替换斜线。然后(因为$ 是一个零宽度断言,并且不消耗任何字符)它用斜杠替换最后的空字符串。删除 /g 即可,因为只会替换第一个匹配项:

    $string =~ s!/*$!/!; # Add a trailing slash
    

    (我还更改了分隔符以使其更具可读性,尽管这与您的问题无关。)

    【讨论】:

    • 谢谢!这非常快!
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2015-07-14
    • 2011-03-09
    相关资源
    最近更新 更多