2013-11-26 80 views
0

這裏檢索多個匹配令牌就是我希望發生從正則表達式

> /x(y\d)*/.somefunction('xy1y2y3').each { |x| puts x } 
y1 
y2 
y3 

這似乎是一個正則表達式一個很自然的使用星號。我匹配了一堆令牌,我希望它們打印出來。

我已經能夠找到最接近的是:

/x((y\d)*)/.match('xy1y2y3')[1].scan(/y\d/).each { |x| puts x } 

這僅僅是糟糕透頂。

+0

如果您的輸出結果糟糕,您希望它看起來像什麼? –

+0

@theTinMan - 輸出很好。這是糟糕的代碼。我必須手動將正則表達式分成兩個階段才能完成單個任務。這是使用'.split'的一個步驟' – Malvolio

回答

0

我想這是你想要什麼:

'xy1y2y3'.gsub(/y\d/) { |s| puts s } 

gsub方法接受一個塊。

1

您遇到的問題與正則表達式而不是Ruby有關。 You are repeating a capture group rather than capturing a repeated group。你可以使用

str.scan(/x((?:y\d)*)/) 

但是,這將捕獲所有組合爲一個字符串。爲了做你真正想做的事情(檢查字符串是否遵循x,然後是這些組),你不幸的是需要按照你的問題做兩個步驟。要麼是這樣,要麼您可以刪除附加要求,並僅按照其他答案的建議搜索該模式。

0

根據您的輸入和輸出,這看起來八九不離十:

'xy1y2y3'.scan(/y\d/) 
# => ["y1", "y2", "y3"] 

使用這個,如果你想打印出來:

puts 'xy1y2y3'.scan(/y\d/) 
# >> y1 
# >> y2 
# >> y3 

字符串的scan是你的朋友,如果你想通過看一個字符串和捕捉重複模式。

+0

但是用'zy1y2y3''做錯了! (它不應該打印出任何內容。)其餘的正則表達式很重要。 – Malvolio

+0

爲什麼它不打印?你的問題在哪裏說的?您需要更好地定義您的輸入和可接受的輸出。 –