我有一个字符串"a/b/c/d/e"
,我希望将除最后/
之外的所有内容替换为。即我的输出应为a.b.c.d/e
。
如何修改替换命令s/\//./g
以执行相同操作?另请注意,层次结构并不总是有4" /
"。它可以是任何数字。
答案 0 :(得分:7)
将所有/
替换为字符串后面的/
;排除了最后一个/
perl -wE'$_ = q(a/b/c/d/e); s{/(?=.*?/)}{.}g; say'
这使用positive lookahead,(?=...)
来强制/
进一步向下(.*?
之后),而不消耗任何东西。
另一种方法是使用否定的字符类模式捕获(然后将其放回字符串中)并在前瞻中仅使用固定字符串/
s{/([^/]*)(?=/)}{.$1}g;
然而,上面的第一种方法是/
匹配并且其余的前瞻变得更快。可能的原因是:([^/]*)
方法中的捕获(并且必须将其复制回字符串中),而第一个方法会覆盖单个字符(.*?
不会回溯)。
基准测试:在v5.10.1和v5.27.2(桌面版)下快126%,在v5.16.1(新服务器)下快110%。测试了4-10个字符长的字符串,用于四个路径组件。
感谢ikegami注意到这一点,并提示并评论比较。