루비 문자열 또는 배열 비교
Ruby에서 두 개의 문자열 또는 배열을 어떻게 비교합니까?
diff.rb는 원하는 것입니다. http://users.cybercity.dk/~dsl8950/ruby/diff.html 인터넷 아카이브를 통해 :
http://web.archive.org/web/20140421214841/http://users.cybercity.dk:80/~dsl8950/ruby/diff.html
배열의 경우 빼기 연산자를 사용하십시오. 예를 들면 :
>> foo = [1, 2, 3]
=> [1, 2, 3]
>> goo = [2, 3, 4]
=> [2, 3, 4]
>> foo - goo
=> [1]
여기 마지막 줄은 goo에있는 foo에서 모든 것을 제거하고 요소 1 만 남겨 둡니다. 두 문자열에 대해이 작업을 수행하는 방법을 모르겠습니다.하지만 게시물을 아는 사람이 있기 전까지는 각 문자열을 배열에서 빼기 연산자를 사용한 다음 결과를 다시 변환합니다.
루비에 좋은 라이브러리가 없어서 답답해서 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
This simple line gives a ^
in the positions that don't match. That's often enough and it's copy/paste-able.
I just found a new project that seems pretty flexible:
http://github.com/pvande/differ/tree/master
Trying it out and will try to post some sort of report.
I had the same doubt and the solution I found is not 100% ruby, but is the best for me. The problem with diff.rb is that it doesn't have a pretty formatter, to show the diffs in a humanized way. So I used diff from the OS with this code:
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
Just for the benefit of Windows people: diffy looks brilliant but I belive it will only work on *nix (correct me if I'm wrong). Certainly it didn't work on my machine.
Differ worked a treat for me (Windows 7 x64, Ruby 1.8.7).
Maybe Array.diff via monkey-patch helps...
http://grosser.it/2011/07/07/ruby-array-diffother-difference-between-2-arrays/
To get character by character resolution I added a new function to 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"]
or with parsing:
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
ReferenceURL : https://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array
'programing tip' 카테고리의 다른 글
React Router v4 (0) | 2021.01.11 |
---|---|
숨길 의도가 있다면 새 키워드를 사용 (0) | 2021.01.11 |
SQL Server 함수 내부의 newid () (0) | 2021.01.11 |
CPU 온도를 얻는 방법? (0) | 2021.01.11 |
파이썬 코드를 한 줄에 80 자 미만으로 유지하려면 어떻게해야합니까? (0) | 2021.01.11 |