2017-10-18 83 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

相關問題