使用perl替换除最后一次之外的所有事件

时间:2017-10-18 01:18:51

标签: regex perl substitution regex-greedy

我有一个字符串"a/b/c/d/e",我希望将除最后/之外的所有内容替换为。即我的输出应为a.b.c.d/e

如何修改替换命令s/\//./g以执行相同操作?另请注意,层次结构并不总是有4" /"。它可以是任何数字。

1 个答案:

答案 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注意到这一点,并提示并评论比较。