2017-04-04 34 views
0

示例匹配:紅寶石 - 如果在數組元素部分地與元件與另一個元件陣列

array1 = ["budget2017.doc", "accounting2017.doc", "mydogisdumb.doc"] 
array2 = ["budget.doc", "accounting.doc", "imstupid.doc"] 

我想兩個陣列比較了相似性和從array1返回相關聯的元件。

array1.select { |x| x.include?(array2) } 

我需要的結果是一個新的陣列["budget2017.doc", "accounting2017.doc"]

但顯然上述不會工作,因爲"budget.doc"不與"budget2017.doc"匹配。如果我可以匹配每個元素的前幾個字符並返回array1中的相關元素,我就可以完成所需的工作。

+0

您想要運行的邏輯是,對於array1中的每個元素X1,遍歷array2中的所有元素,以及array2中的每個元素X2,如果X1與X2匹配,則將其添加到結果中。你可以用'=〜'運算符來使用正則表達式搜索(x1 =〜x2 iirc)。 – Vall3y

+0

這裏有確切的模式嗎?如果是前兩個,你可以刪除數字。但對於後者,你有一些混合。在一般情況下,您可以使用Levenstein或Jaro-Winkler距離等字符串相似度算法。你能否澄清一下考慮抽象匹配兩個字符串需要什麼? – ndn

+0

ndn - 每個數組中將有數百個文件名,數組1中的文件名將與數組2中的文件名具有相同的開始,但在擴展之前將包含一些額外的字符。如果每個文件名的前幾個字符都相同,我只對匹配感興趣。 – Sean

回答

1
array1 = %w[budget2017.doc accounting2017.doc mydogisdumb.doc] 
array2 = %w[budget.doc accounting.doc imstupid.doc] 

array1.select do |elem| 
    array2.any? do |ee| 
    s, e = ee.split('.') 
    elem.start_with?(s) && elem.end_with?(e) 
    end 
end 
#⇒ ["budget2017.doc", "accounting2017.doc"] 

或者,位更有效的:

selectors = array2.map { |e| e.split('.') } 
array1.select do |elem| 
    selectors.any? do |(s, e)| 
    elem.start_with?(s) && elem.end_with?(e) 
    end 
end 
#⇒ ["budget2017.doc", "accounting2017.doc"] 
0

按照評價,發現的array1所有元素,其中相同的前7個字符作爲元素具有選自array2

array1.select do |element| 
    array2.any? { |match_candidate| match_candidate.start_with? element[0...7] } 
end 
+0

ndn - 我會在今晚嘗試。謝謝! – Sean

+0

這對我有效。再次感謝。 – Sean

0
arr1 = ["budget2017.doc", "acc2017.doc", "acc.doc", "budget2016.doc", "foo.doc"] 
arr2 = ["budget.doc", "acc.doc", "foo.docx,", "goo.doc"] 

a2 = arr2.map { |s| s.split('.') } 
    #=> [["budget", "doc"], ["acc", "doc"], ["foo", "docx,"], ["goo", "doc"]] 
arr1.select { |s1| a2.any? { |pfx, sfx| s1 =~ /\A#{pfx}.*\.#{sfx}\z/ } } 
    #=> ["budget2017.doc", "acc2017.doc", "acc.doc", "budget2016.doc"] 
+0

'start_with?'和'end_with?'被證明是比正則表達式匹配更快的方式。 – mudasobwa

相關問題