2009-08-14 84 views
0

一個列表中的每個條目中刪除下劃線字符有字符串從在路徑

 
    paths = ['foo/bar_baz/_sunny', bar/foo_baz/_warm', 'foo/baz/_cold', etc etc] 

我需要在路徑的每個最後一部分除去下劃線的陣列(_sunny =>晴天,_warm =>溫,_cold =>冷)

 
    paths.each do |path| 
     path_parts = path.split('/') 
     path_parts.last.sub!(/^_/, '') 
     puts path_parts.join('/') 
    end 

但是,解決方案有點骯髒。我覺得可以在不使用path.split和path.join的情況下完成。你有什麼想法?

在此先感謝

+1

請編輯標題對於這個問題,就像「從路徑列表中的每個條目中刪除下劃線字符」,因爲這與「改變代碼的內部結構而不改變其外部行爲」意義上的重構無關。 – mikej 2009-08-14 15:29:32

+0

確定標題根據您的建議更改 – mlomnicki 2009-08-17 14:26:31

回答

2

我不知道紅寶石,但圖案

/('[a-zA-Z0-9_\/]*\/)_([a-zA-Z0-9_]*')/g 

可以用

'$1$2' 

更換,如果$x在紅寶石用來引用匹配組,而g是有效標誌。它需要被應用一次到字符串,沒有分割或連接。

+0

謝謝!解決問題 – mlomnicki 2009-08-14 15:24:32

+1

因此接受丹尼爾的回答 – mikej 2009-08-14 15:27:18

2

或者,更簡潔:

paths.map {|p| p.sub(/_(?=[^\/]*$)/,"")} 

也就是說,去掉後跟任意數量的非斜線,然後在字符串的結尾任何下劃線...

+0

非常好!但在正則表達式中'?='是什麼意思? – mlomnicki 2009-08-16 17:51:43

+0

「'?='」是一個不匹配的預見。在那個例子中,只有在下一個字符是指定的時候它纔會匹配「_」,但是這些下一個字符不會是匹配的一部分。這樣,在「_」被替換的地方,您不需要重複出現在後面的字符。我自己的解決方案可以使用'?'和'?='來避免使用組。它可以帶來顯着的性能提升。 – 2009-08-16 23:38:58

+0

非常感謝你的解釋,丹尼爾! – mlomnicki 2009-08-17 14:27:28