2008-09-17 36 views
51

रूबी में दो स्ट्रिंग्स या सरणी का अंतर कैसे बना सकता हूं?एक रूबी स्ट्रिंग या सरणी

+0

मैं आशा व्यक्त की कि अब यह फिर से खोल दी जा सकती है, में यह सवाल reworded है। मुझे लगता है कि सवाल वैध था, सिर्फ इस तरह से शब्द जिसने इसे ध्वनि बना दिया, जिसके परिणामस्वरूप बहुत सारे राय जवाब दिए जाएंगे। यदि आप इसे फिर से खोलने में सहायता करना चाहते हैं, तो आपको "रूबी" और "diff" प्रश्न टैग के नीचे एक छोटा "फिर से खोलना" लिंक देखना चाहिए। – Gerry

+0

यह 10 वां प्रश्न है जो मुझे इस सप्ताह मिला है जिसे ऑफ विषय के रूप में चिह्नित किया गया है। यह विषय बंद नहीं है। यह एक अच्छा सवाल है। कृपया, हॉल मॉनीटर, इसे करने से रोकें। – user1130176

+0

तारों के लिए आप इस उत्तर का उपयोग कर सकते हैं http://stackoverflow.com/a/42573286/745489 – Dzmitry

उत्तर

20

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

+19

नोट: diff.rb जीपीएल –

+15

उन लोगों के लिए है जो जीपीएल के प्रभाव को कम नहीं करते हैं: इसमें 'कॉपी बाएं' अवधारणा शामिल है जो मांग करता है कि आप किसी भी स्वामित्व कोड को स्रोत में खोलने के लिए मजबूर कर दें और जीपीएल-अपने पूर्व-स्वामित्व कोड को छोड़ दें। –

+1

लिंक (http://users.cybercity.dk/~dsl8950/ruby/diff.html) मृत –

30

सरणियों के लिए, माइनस ऑपरेटर का उपयोग करें। उदाहरण के लिए:

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

यहाँ अंतिम पंक्ति foo से सब कुछ goo में भी है कि, मैं कैसे दो स्ट्रिंग्स के लिए यह करने के लिए पता नहीं है बस तत्व 1. छोड़ने निकालता है, लेकिन कोई ऐसा जो के बारे में पोस्ट जानता है जब तक यह, आप बस प्रत्येक स्ट्रिंग को सरणी में परिवर्तित कर सकते हैं, माइनस ऑपरेटर का उपयोग कर सकते हैं और फिर परिणाम को वापस परिवर्तित कर सकते हैं।

+2

यह गलत है। foo = [1,2,3] बार = [4,5,6] foo - बार # => [1,2,3] रूबी के कार्यान्वयन सही है, लेकिन मैं पतली नहीं है यह है सवाल क्या पूछा गया। –

+6

क्रिस एल के बिंदु के आसपास जाने के लिए, आप (foo - bar) + (बार - foo) कर सकते हैं। सरणी के बीच सभी अंतर प्राप्त करने के लिए (या स्ट्रिंग्स यदि आप .to_a का उपयोग करते हैं) – diedthreetimes

18

तारों के लिए, मैं सबसे पहले रूबी जेम को आजमाऊंगा जो @ सैम-केसर नीचे उल्लिखित है। यह स्थापित करने के लिए आसान है: 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

+0

2011 में एक नया अपडेट rubygems को धक्का दिया गया है। –

+0

क्या कोई HTML के लिए इसका उपयोग करने में सफल रहा है? – aaandre

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 प्लगइन के साथ इसका इस्तेमाल किया।

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

इसे आज़माना और रिपोर्ट के कुछ प्रकार पोस्ट करने की कोशिश करेंगे:

+0

धन्यवाद, यह बेहद उपयोगी था। – aaandre

2

मैं सिर्फ इतना है कि बहुत लचीला लगता है एक नई परियोजना पाया।

2

मुझे भी यही संदेह था और मुझे जो समाधान मिला वह 100% रूबी नहीं है, लेकिन मेरे लिए सबसे अच्छा है। diff.rb के साथ समस्या यह है कि यह एक मानवीय तरीके से diffs दिखाने के लिए एक सुंदर formatter नहीं है। इसलिए मैं इस कोड के साथ ओएस से 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 
+1

अस्थायी फ़ाइलों का उपयोग करना आम तौर पर एक बुरा विचार है जब आपके पास मेमोरी विकल्प उपलब्ध होता है। – epochwolf

+0

@epochwolf आप मेमोरी से अलग कैसे पढ़ रहे हैं? जहां तक ​​मुझे पता है, यह केवल diffing फ़ाइलों का समर्थन करता है। – Gerry

21

मैं रूबी में इस के लिए एक अच्छा पुस्तकालय की कमी के साथ निराश हो गया, तो मैं http://github.com/samg/diffy लिखा था। यह कवर के तहत diff का उपयोग करता है, और सुविधाजनक होने पर और सुंदर आउटपुट विकल्प प्रदान करने पर केंद्रित है।

+2

मैं अपनी परियोजनाओं में से एक के लिए diffy का उपयोग कर रहा हूँ। बस काम करता है। धन्यवाद। – ardsrk

2

बस Windows लोगों के लाभ के लिए: diffy शानदार लग रहा है लेकिन मैं belive यह केवल * nix (मुझे ठीक कर लें पर काम करेंगे मैं गलत हूँ)। निश्चित रूप से यह मेरी मशीन पर काम नहीं किया।

मतभेद ने मेरे लिए एक इलाज किया (विंडोज 7 x64, रूबी 1.8.7)।

+0

अब कुछ विंडोज़ समर्थन बेक किया गया है। README में आपको किस प्रकार के सेटअप की आवश्यकता है, इसके बारे में कुछ विवरण हैं। https://github.com/samg/diffy#on-windows – samg

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 
संबंधित मुद्दे