2011-03-22 25 views
1

我有幾個正則表達式的表達式紅寶石 - 查找REGEX匹配位置和W最匹配應用正則表達式?

sample_text = 'lots of text' 

regex_1 =/stuff 1/
regex_2 =/different stuff 2/
regex_3 =/different stuff 3/
regex_4 =/different stuff 4/
regex_5 =/different stuff 5/

的名單,我想知道怎麼做優雅是每個正則表達式,搜索在sample_text並返回匹配的位置是什麼。

然後我想使用已經從sample_text

思考的起點最低/最匹配的位置正則表達式?建議?謝謝

回答

2
sample_text = 'lots of text' 

regexes = [ 
/stuff 1 /, 
/different stuff 2 /, 
/different stuff 3 /, 
/different stuff 4 /, 
/different stuff 5/
] 

infinity = 1.0/0 
regex_to_use = regexes.min_by{ |re| sample_text.index(re) || infinity } 

你只要把正則表達式到一個數組中,並嘗試他們一個接一個。匹配指數最低的那個獲勝。在上面的代碼中,我們將與正則表達式完全不匹配的regexes分類爲與字符串的開頭無關。如果找到多個具有相同鄰近度的正則表達式,則返回第一個。

+0

這太好了。謝謝。會發生什麼事情,沒有找到匹配? – AnApprentice 2011-03-22 17:44:09

+0

將返回第一個正則表達式。如果你預先選擇符合你的樣本的正則表達式,那麼如果沒有找到匹配結果,'nil'將被返回 – fl00r 2011-03-22 17:58:03

2
regexes = [ regex_1, regex_2, regex_3, regex_4, regex_5 ]. 
    select{|r| sample_text =~ r }. 
    sort_by{|r| sample_text =~ r} 
regexes.first 
#=> /some regex here/ 

它會根據它們的匹配位置對regexps進行排序。

  1. sample_text =~ r收益匹配位置
  2. sort_by將排序匹配位置我們的陣列

UPD

由於@Holger剛纔提到match可以返回nil這將中斷我們的sort_by,所以我們應該只有select那些正則表達式match ou [R smaple_text

和短小的哈克的方式:

[ regex_1, regex_2, regex_3, regex_4, regex_5 ].sort_by{|r| 1.0/(sample_text=~r).to_i} 
+0

fl00r你可以給一點點說明這是什麼嗎? – AnApprentice 2011-03-22 17:09:09

+1

簡短說明添加 – fl00r 2011-03-22 17:12:16

+0

謝謝,我給了它一個投票,但傾向於接受Holger的答案,因爲它看起來更清潔,更容易閱讀。隨意不同意。 – AnApprentice 2011-03-22 17:45:01

0
sample_text = 'lots of text' 

regexes = [ 
    /stuff 1 /, 
    /different stuff 2 /, 
    /different stuff 3 /, 
    /different stuff 4 /, 
    /different stuff 5/
] 

positions = regexes.map{|re| sample_text.index(re)} 
regex_to_use = regexes[positions.index(positions.compact.min)] 
+0

好解決方案:) – fl00r 2011-03-22 21:15:14

+0

@ fl00r感謝您的評論。 – sawa 2011-03-23 01:55:12

+0

我犯了一個巨大的錯誤。我修好了它。 – sawa 2011-03-23 02:05:05