2011-11-05 50 views
1

使用Ruby 1.8.7正則表達式匹配,直到字中包含的陣列

我需要抓住一切達到一定的字 - 我想對陣的話在數組中。例如:

match_words = ['title','author','pages'] 
item = "Title: Jurassic Park\n" 
item += "Author: Michael Crichton\n" 

if item =~ /title: (.*)#{match any word in match_words array}/i 
    #do something here 
end 

因此,這將理想地返回「侏羅紀公園\ n」。我目前在換行符上匹配,但發現我將匹配的數據可能會在奇怪的地方出現換行符,比如句子的中間部分。所以,我認爲匹配到下一個match_word將是一個好主意。

這是可能的,或者可以通過其他方式完成?

+0

題外話,但它與Ruby的正則表達式,而不是Rails。 –

+0

我曾經認爲可能是這種情況。對不起,會正確的。 – d3vkit

回答

3

試試這個關於大小

item.scan(/(title|author|pages):\s*?(.+)/i) 

它說的是找出所有啓動(不區分大小寫)與任何標題,作者或頁面結果,然後跟着一個冒號和選項的白色空間,然後字符。捕獲標籤,然後捕獲空白符後面的字符。掃描方法將盡可能匹配。

+0

+1;比我的好多了。 –

+0

儘管@scott ripley使用的方法更接近我想要做的事情(使用連接將數組變爲一個字符串),但這很好解釋了這一點,我認爲值得勝利。感謝所有的好主意! – d3vkit

+0

在我用同樣的正則表達式回答之後,我意識到如果文本在「奇怪的地方」有換行符,這將不起作用。所以請看看我的新答案。 –

1

只是遍歷匹配的單詞,並執行正常的比較,因爲你通常會。

match_words.each do |word| 
    if item =~ /#{word}/ # Plus case sensitivity, start/end of item, etc. 
     # etc. 
    end 
end 

但是,如果你知道你關心的事情是在線條的開頭,然後劈在\n輸入字符串,只需使用start_with,而不是用正則表達式困擾 - 這部分地取決於什麼真實的數據看起來像。

0

首先,從match_words創建一個|分隔的關鍵字列表。 然後,使用string.scan將字符串分開,爲您提供一個包含結果數組的數組。 See the end of this tutorial for a reference.

這是我最好的拍攝:

keywords = match_words.join('|') 
results = item.scan(/(#{keywords}):\s*(.+?)\s*(?= (#{keywords}):)/im) 

結果:[["Title", "Jurassic Park"], ["Author", "Michael Crichton"]]

不要忘記使用/m開關,以指示要.匹配換行符。

解釋模式:我們尋找關鍵字,然後使用「向前看」(?=)找到下一個關鍵字而不捕獲它。我們使用「惰性」表達.+?捕獲所有字符,以便我們不捕獲其他關鍵字。

+0

感謝你的想法,非常接近 - 儘管\ m通過使比賽超出換行符實際上導致了問題(結果類似於[「title」,「jurassic park \ nauthor:」],但實際上它是這樣的:D – d3vkit

+0

嗯,現在我想到了,'/ m'需要得到像'Jurassic \ nPark'這樣的結果,但是它失敗了,因爲表達式太貪婪。我會用這個解決方案更新我的答案。 –

相關問題