2017-10-18 87 views
4

我有一个字符串,表示"a/b/c/d/e",我想将除最后的/之外的所有字符替换为。即我的输出应该是a.b.c.d/e使用perl代替除最后一次出现以外的任何地方

如何修改我的替代命令s/\//./g来做同样的事情?另请注意,层次结构并不总是有4个“/”。它可以是任何数字。

+0

提醒,请参阅[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – zdim

回答

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

+0

也许你可以解释为什么这个工程。 – xxfelixxx

+0

@xxfelixxx对,谢谢。编辑。 – zdim

+3

更高效? 's {/([^/]*)(?=/)}{.$ 1} g;' – ikegami

相关问题