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