문제

Ruby에서 두 문자열이나 배열의 차이점을 어떻게 확인하나요?

도움이 되었습니까?

다른 팁

배열의 경우 빼기 연산자를 사용합니다.예를 들어:

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

여기서 마지막 줄은 foo에서 goo에 있는 모든 항목을 제거하고 요소 1만 남깁니다.두 개의 문자열에 대해 이 작업을 수행하는 방법을 모르지만 이에 대한 게시물을 아는 사람이 있을 때까지 각 문자열을 배열로 변환하고 빼기 연산자를 사용한 다음 결과를 다시 변환하면 됩니다.

저는 Ruby에 이에 대한 좋은 라이브러리가 부족해서 좌절감을 느꼈습니다. 그래서 다음과 같이 썼습니다. http://github.com/samg/diffy.그것은 사용한다 diff 내부적으로는 편리하고 예쁜 출력 옵션을 제공하는 데 중점을 둡니다.

문자열의 경우 먼저 @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

위에서 @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 플러그인.

도 있습니다 diff-lcs 보석으로 구할 수 있는 것입니다. 2004년 이후로 업데이트되지 않았지만 저희는 아무 문제 없이 잘 사용하고 있습니다.

편집하다: 2011년에 새로운 버전이 출시되었습니다.다시 활발한 개발에 들어간 것 같습니다.

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

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

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

방금 꽤 유연해 보이는 새 프로젝트를 찾았습니다.

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

그것을 시험해보고 일종의 보고서를 게시하려고 노력할 것입니다.

나도 같은 의심을 품었고 내가 찾은 해결책은 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

Windows 사용자의 이익을 위해:diffy는 훌륭해 보이지만 *nix에서만 작동할 것이라고 믿습니다(틀렸다면 정정해 주세요).확실히 내 컴퓨터에서는 작동하지 않았습니다.

Differ는 저에게 큰 도움이 되었습니다(Windows 7 x64, Ruby 1.8.7).

어쩌면 원숭이 패치를 통한 Array.diff가 도움이 될 수도 있습니다.

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

문자 해상도로 문자를 얻으려면 다메라우-레벤슈타인 보석

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top