這裏檢索多個匹配令牌就是我希望發生從正則表達式
> /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 }
這僅僅是糟糕透頂。
這裏檢索多個匹配令牌就是我希望發生從正則表達式
> /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 }
這僅僅是糟糕透頂。
我想這是你想要什麼:
'xy1y2y3'.gsub(/y\d/) { |s| puts s }
的gsub
方法接受一個塊。
您遇到的問題與正則表達式而不是Ruby有關。 You are repeating a capture group rather than capturing a repeated group。你可以使用
str.scan(/x((?:y\d)*)/)
但是,這將捕獲所有組合爲一個字符串。爲了做你真正想做的事情(檢查字符串是否遵循x
,然後是這些組),你不幸的是需要按照你的問題做兩個步驟。要麼是這樣,要麼您可以刪除附加要求,並僅按照其他答案的建議搜索該模式。
如果您的輸出結果糟糕,您希望它看起來像什麼? –
@theTinMan - 輸出很好。這是糟糕的代碼。我必須手動將正則表達式分成兩個階段才能完成單個任務。這是使用'.split'的一個步驟' – Malvolio