2010-09-06 46 views
5
集團

這是我在做什麼正則表達式 - 保存重複捕獲

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.match(/(^\%\w+)([\.|\#]\w+)+/) 
puts a.inspect 

這是我得到

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever"> 

這就是我想要

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever"> 

幫助?我嘗試和失敗:(

回答

3

這只是拍攝組的工作。如果你想保存所有這些子的,把量詞捕獲組:

a = a.match(/(^%\w+)((?:[.#]\w+)+)/) 

然後你的第二個捕獲會:

2:".rockets#diamonds.ribbons.forever" 

...你可以打破它的自己的方式休息

8

一般情況下,你不能得到捕獲組任意數量的,但如果你使用scan你可以得到一個比賽每一個令牌你想捕捉:

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.scan(/^%\w+|\G[.|#]\w+/) 
puts a.inspect 

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"] 

這是不是從你的正則表達式太不一樣了,但我刪除重複的最後的令牌。 \G不是太知名 - 它告訴引擎匹配上一場比賽結束的地方,所以當比賽之間有多餘的字符時(%span :P .rockets),它不會中斷。

一般來說,如果您有多個匹配的原始正則表達式,此方法可能會添加一些工作,因爲您沒有將組分隔開以匹配,但由於match返回單個結果,它應該可以正常工作。

工作示例:http://ideone.com/nnmki