2008-09-17 131 views
51

如何在Ruby中對兩個字符串或數組進行比較?比較ruby字符串或數組

+0

我已經改寫,希望現在可以重新打開了這個問題。我認爲這個問題是有效的,只是措辭使它聽起來像會導致很多意見的答案。如果你想幫助重新打開它,你應該在「ruby」和「diff」問題標籤下看到一個小小的「重新打開」鏈接。 – Gerry 2016-06-30 23:38:33

+0

這是關於本週發現的第10個問題,已被標記爲脫離主題。它不是脫離主題。這是一個很好的問題。請大廳監視器,停止這樣做。 – user1130176 2017-02-16 11:34:03

+0

對於字符串,你可以使用這個答案 http://stackoverflow.com/a/42573286/745489 – Dzmitry 2017-03-03 07:44:06

回答

20
+19

注意:diff.rb是GPL – 2009-07-31 04:36:57

+15

對於那些不贊同GPL的含義:它包括'copyleft'概念這要求您將任何專有代碼合併到一起,迫使您開源和GPL-泄露您以前的專有代碼。 – 2014-04-25 15:21:27

+1

鏈接(http://users.cybercity.dk/~dsl8950/ruby/diff.html)已死 – 2017-02-21 07:15:12

30

對於數組,使用減號操作。例如:

>> foo = [1, 2, 3] 
=> [1, 2, 3] 
>> goo = [2, 3, 4] 
=> [2, 3, 4] 
>> foo - goo 
=> [1] 

這裏的最後一行除去從富的一切,也是咕,只留下元素1.我不知道如何爲兩個字符串做到這一點,但直到有人誰知道帖子它可以將每個字符串轉換爲一個數組,使用minus運算符,然後將結果轉換回來。

+2

這是不正確的。 富= [1,2,3] 欄= [4,5,6] 富 - 巴#=> [1,2,3] Ruby的實現是正確的,但我不薄,這是什麼問題要求。 – 2010-08-24 06:59:35

18

對於字符串,我會首先嚐試下面提到的@sam-saffron的Ruby Gem。它易於安裝: http://github.com/pvande/differ/tree/master

gem install differ 

irb 
require 'differ' 

one = "one two three" 
two = "one two 3" 

Differ.format = :color 
puts Differ.diff_by_word(one, two).to_s 

Differ.format = :html 
puts Differ.diff_by_word(one, two).to_s 
5

還有diff-lcs它可作爲寶石。 自2004年以來它並未更新,但 我們一直在使用它,沒有任何問題。

編輯: 2011年發佈了一個新版本。看起來它回到了積極的發展階段。

http://rubygems.org/gems/diff-lcs

5

的HTMLDiff是@ DA01上面提到的爲我工作。

script/plugin install git://github.com/myobie/htmldiff.git 

# bottom of environment.rb 
require 'htmldiff' 

# in model 
class Page < ActiveRecord::Base 
    extend HTMLDiff 
end 

# in view 
<h1>Revisions for <%= @page.name %></h1> 
<ul> 
<% @page.revisions.each do |revision| %> 
    <li> 
    <b>Revised <%= distance_of_time_in_words_to_now revision.created_at %> ago</b><BR> 
     <%= Page.diff(
     revision.changes['description'][0], 
     revision.changes['description'][1] 
    ) %> 
     <BR><BR> 
    </li> 
<% end %> 

# in style.css 
ins.diffmod, ins.diffins { background: #d4fdd5; text-decoration: none; } 
del.diffmod, del.diffdel { color: #ff9999; } 

看起來不錯。順便說一句,我用這個acts_as_audited插件。

2

我有同樣的疑問,我發現的解決方案不是100%的紅寶石,但對我來說是最好的。 diff.rb的問題是它沒有一個漂亮的格式化程序,以人性化的方式顯示差異。所以我用DIFF從操作系統與此代碼:

def diff str1, str2 
    system "diff #{file_for str1} #{file_for str2}" 
end 

private 
def file_for text 
    exp = Tempfile.new("bk", "/tmp").open 
    exp.write(text) 
    exp.close 
    exp.path 
end 
21

我很沮喪與缺乏紅寶石好的庫這個的,所以我寫了http://github.com/samg/diffy。它使用下面的diff,並側重於方便,並提供漂亮的輸出選項。

2

不僅僅是Windows人民的利益:diffy看起來輝煌,但我相信它只會在* nix(是否正確我的工作我錯了)。當然,它在我的機器上不起作用。

Differ爲我工作(Windows 7 x64,Ruby 1.8.7)。

0

要獲取字符的決議角色,我添加了一個新功能,damerau-levenshtein gem

require "damerau-levenshtein" 
differ = DamerauLevenshtein::Differ.new 
differ.run "Something", "Smothing" 
# returns ["S<ins>o</ins>m<subst>e</subst>thing", 
# "S<del>o</del>m<subst>o</subst>thing"] 

或解析:

require "damerau-levenshtein" 
require "nokogiri" 

differ = DamerauLevenshtein::Differ.new 
res = differ.run("Something", "Smothing!") 
nodes = Nokogiri::XML("<root>#{res.first}</root>") 

markup = nodes.root.children.map do |n| 
    case n.name 
    when "text" 
    n.text 
    when "del" 
    "~~#{n.children.first.text}~~" 
    when "ins" 
    "*#{n.children.first.text}*" 
    when "subst" 
    "**#{n.children.first.text}**" 
    end 
end.join("") 

puts markup