2011-08-18 69 views
1

我想查看兩次相同模式的字符串。只有當加入「和」,但我似乎不能拉的第二場比賽正確需要改進紅寶石正則表達式

ruby-1.9.2-p290 :040 > text 
=> "start a week and 2 days" 
ruby-1.9.2-p290 :041 > text.scan /[a\d] weeks?|months?|years? and [a\d] weeks?|months?|days?/ 
=> ["a week", "days"] 

我不明白,爲什麼第二場比賽是「天」,而不是「2天」

如果我交換「a」和「2」,然後第二場比賽仍然排除那個角色。

任何幫助大量讚賞!


爲了澄清我的算法將是

如果字符串包含X單元和y單位然後 做一些X單元, 做一些y單位 結束


我我也試過

ruby-1.9.2-p290 :054 > text.scan /[a|\d] (weeks?|months?|years?) and [a|\d] (weeks?|months?|days?)/ 
=> [["week", "days"]] 
ruby-1.9.2-p290 :055 > text.scan /([a|\d] weeks?|months?|years?) and ([a|\d] weeks?|months?|days?)/ 
=> [] 

作爲一個實驗我嘗試在改進簡化沒有成功的模式

ruby-1.9.2-p290 :059 > text = "2 weeks and a day" 
=> "2 weeks and a day" 
ruby-1.9.2-p290 :060 > text.scan /[a|\d] weeks?|months?|years?|days?/ 
=> ["2 weeks", "day"] 
ruby-1.9.2-p290 :061 > text = "a week and 2 days" 
=> "a week and 2 days" 
ruby-1.9.2-p290 :062 > text.scan /[a|\d] weeks?|months?|years?|days?/ 
=> ["a week", "days"] 

感謝所有誰貢獻......

/([a\d] years?|[a\d] months?|[a\d] weeks?) and ([a\d] days?|[a\d] weeks?|[a\d] months?)/ 

符合我的要求,但我肯定會有興趣知道它是否可以縮小尺寸...

ruby-1.9.2-p290 :077 > text = "2 weeks and a day" 
=> "2 weeks and a day" 
ruby-1.9.2-p290 :078 > text.scan /([a\d] years?|[a\d] months?|[a\d] weeks?) and ([a\d] days?|[a\d] weeks?|[a\d] months?)/ 
=> [["2 weeks", "a day"]] 
ruby-1.9.2-p290 :079 > text = "2 weeks 2 days" 
=> "2 weeks 2 days" 
ruby-1.9.2-p290 :080 > text.scan /([a\d] years?|[a\d] months?|[a\d] weeks?) teand ([a\d] days?|[a\d] weeks?|[a\d] months?)/ 
=> [] 
+0

字符類'[a | \ d]'匹配任何字符'a',文字'''或數字。在字符類內部,您不需要使用'|'進行替換。在字符類之外,您需要指定在哪個級別使用括號進行交替。 '/ this an |並且/'匹配''這個''''或'「和那個'',而'/ this(?:an |和)/''匹配''這個和''或'」this和那個「'。 – Phrogz

+0

我很困惑,我的答案被刪除,並轉移到問題中,因爲「這是一個問答網站,而不是新聞組或討論論壇,它可以通過某人提出問題,然後人們可以發佈問題的答案通過在「您的答案」區域輸入內容,您的帖子不是對所問問題的答案(即使您是提問者),也不應該顯示爲一個問題。「這絕對是答案 - 下面的人和Phrogz的貢獻幫助我解決了問題... –

+0

你問了一個問題。你有1-2個答案(據我所知)正確並完全解答了你的問題。此時適當的步驟是將其中一個答案標記爲已接受。如果您有其他問題,請將其作爲一個新問題發佈。重新張貼正確的答案作爲自己的答案,並提出一個新問題並不是繼續討論的正確方法。 (這不是一個嚴格的政策遵守問題,而是確保該網站充滿了可以幫助他人的具體QA。)如果您只有一個較小的後續問題,您可以將其作爲評論發佈並寄予希望。 – Phrogz

回答

2

你需要把你的左右交替組括號:... (weeks?|months?|years?) ...

但是你的正則表達式仍然有問題,因爲你匹配整個字符串,而不是使用組,以獲得特定部分。 String#scan可能不是最簡單的方法。使用text.sub(/^start\s+/,"").split(/\s+and\s+/)可能會更好。

如果您想將這些解析爲日期,您還可以查看Chronic寶石。

+0

巧合的是,我這樣做,因爲慢性不能處理例如「2周,一天後」的用例 –

+0

啊。我在某處發現了一個帖子,提示在「and」處分裂,然後分別將每個部分傳遞給Chronic。你嘗試過嗎? – jtbandes

3
(a|\d) (weeks?|months?|years?) and (a|\d) (weeks?|months?|days?)