it-swarm-ko.tech

diff a Ruby 문자열 또는 배열

Ruby에서 두 개의 문자열 또는 배열을 어떻게 diff합니까?

54
Josh Moore
20
Brian Mitchell

배열의 경우 빼기 연산자를 사용하십시오. 예를 들면 다음과 같습니다.

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

마지막 줄은 goo에있는 foo에서 모든 요소를 ​​제거하고 요소 1 만 남겨 둡니다. 두 문자열에 대해이 작업을 수행하는 방법을 모르지만 그것에 대해 게시물을 알고있는 사람까지 각 문자열을 배열에서 빼기 연산자를 사용한 다음 결과를 다시 변환하십시오.

32
Chris Bunch

루비에 좋은 라이브러리가 없기 때문에 좌절했기 때문에 http://github.com/samg/diffy 를 썼습니다. 표지 아래에 diff를 사용하며 편리하고 출력 옵션을 제공하는 데 중점을 둡니다.

24
samg

문자열의 경우 먼저 @ sam-saffron이 언급 한 Ruby 보석을 사용해보십시오. 설치가 더 쉽습니다. 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
19
da01

@ da01에서 언급 한 HTMLDiff가 저에게 효과적이었습니다.

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 플러그인.

5
Brian Armstrong

도 있습니다 diff-lcs 보석으로 사용 가능합니다. 2004 년 이후 업데이트되지 않았지만 우리는 아무 문제없이 그것을 사용하고 있습니다.

편집 : 2011 년에 새 버전이 출시되었습니다. 다시 개발중인 것으로 보입니다.

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

5
Grant Hutchins
t=s2.chars; s1.chars.map{|c| c == t.shift ? c : '^'}.join

이 간단한 라인은 ^ 일치하지 않는 위치에 있습니다. 종종 충분하며 복사/붙여 넣기가 가능합니다.

3
Steve

Windows 사람들의 이익을 위해 : diffy는 훌륭해 보이지만 * nix에서만 작동한다는 것을 믿습니다 (잘못되면 정정하십시오). 확실히 내 컴퓨터에서 작동하지 않았습니다.

Differ는 나를 위해 치료를했습니다 (Windows 7 x64, Ruby 1.8.7).

2
russthegibbon

방금 융통성이있는 새 프로젝트를 찾았습니다.

http://github.com/pvande/differ/tree/master

그것을 시도하고 일종의 보고서를 게시하려고합니다.

2
Sam Saffron

나는 똑같은 의심을 가지고 있었고 내가 찾은 해결책은 100 % 루비가 아니지만 나에게 가장 좋습니다. diff.rb의 문제점은 인간화 된 방식으로 diff를 보여주기 위해 예쁜 포매터가 없다는 것입니다. 그래서 나는이 코드로 OS의 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
2
Daniel Cukier

문자 해상도로 문자를 얻으려면 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
1
dimus

Monkey-patch를 통한 Array.diff가 도움이 될 수 있습니다 ...

http://grosser.it/2011/07/07/Ruby-array-diffother-difference-between-2-arrays/

1
grosser