我有一个字符串 "a/b/c/d/e"
并且我想将除最后一个 /
之外的所有内容替换为 .即我的输出应该是 a.b.c.d/e
。
如何修改我的替代命令 s/\//./g
来执行相同的操作?另请注意,层次结构并不总是有 4 个“/
”。它可以是任何数字。
最佳答案
替换所有 /
,其中 /
位于字符串的下方;因此排除了最后一个 /
perl -wE'$_ = q(a/b/c/d/e); s{/(?=.*?/)}{.}g; say'
这使用了 positive lookahead , (?=...)
断言 /
进一步向下(在 .*?
之后)的存在,而不消耗任何东西。
另一种方法是使用取反字符类模式进行捕获(然后将其放回字符串中)并仅使用固定字符串 /
在 lookahead
s{/([^/]*)(?=/)}{.$1}g;
上面的第一种方法使用 /
匹配并对其余部分进行前瞻,结果速度更快。可能的原因是在 ([^/]*)
方法中捕获(并且它必须将其复制回字符串中),第一种方法执行单个字符覆盖( .*?
不回溯)。
基准测试:在 v5.10.1 和 v5.27.2(桌面)下速度提高 126%,在 v5.16.1(新服务器)下速度提高 110%。已针对四个路径组件使用 4-10 个字符的长字符串进行测试。
感谢 ikegami感谢您注意到这一点并提示和评论比较。
关于regex - 使用 perl 替换除最后一次出现的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801422/