¿Cómo hago una diferencia de dos cadenas o matrices en Ruby?diff a ruby string o array
Respuesta
diff.rb es lo que quiere, que está disponible en http://users.cybercity.dk/~dsl8950/ruby/diff.html a través de Internet Archive:
http://web.archive.org/web/20140421214841/http://users.cybercity.dk:80/~dsl8950/ruby/diff.html
Nota: diff.rb es GPL –
Para aquellos que no asimilan las implicaciones de GPL: incluye un concepto de 'copyleft' que exige que cualquier código propietario en el que lo incorpores te obligue a abrir el código fuente y GPL-regalar tu código previamente propietario. –
enlace (http://users.cybercity.dk/~dsl8950/ruby/diff.html) está muerto –
Para matrices, utilice el operador menos. Por ejemplo:
>> foo = [1, 2, 3]
=> [1, 2, 3]
>> goo = [2, 3, 4]
=> [2, 3, 4]
>> foo - goo
=> [1]
Aquí la última línea elimina todo, desde foo que también está en sustancia pegajosa, dejando sólo el elemento 1. No sé cómo hacer esto por dos cuerdas, pero hasta que alguien que conozca acerca de los mensajes puede convertir cada cadena en una matriz, usar el operador menos y luego convertir el resultado.
Esto es incorrecto. foo = [1,2,3] bar = [4,5,6] foo - bar # => [1,2,3] aplicación de Ruby es correcta, pero no hacer esto es delgada qué fue lo que preguntó la pregunta. –
Para evitar el punto de Chris L', puede hacer (foo - bar) + (bar - foo). Para obtener todas las diferencias entre las matrices (o cadenas si usa .to_a) – diedthreetimes
Para cuerdas, probaría primero la gema Ruby que @ sam-saffron menciona a continuación. Es más fácil de instalar: 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
También hay diff-lcs
que está disponible como una joya.
No se ha actualizado desde 2004, pero
lo hemos estado utilizando sin ningún problema.
Editar: Se lanzó una nueva versión en 2011. Parece que está de vuelta en desarrollo activo.
Se ha enviado una nueva actualización a rubygems en 2011. –
¿Alguien ha tenido éxito al usar esto para HTML? – aaandre
El HTMLDiff que da01 @ menciones anteriormente trabajó para mí.
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; }
Se ve bastante bien. Por cierto, utilicé esto con el complemento acts_as_audited
.
Gracias, esto fue extremadamente útil. – aaandre
Acabo de encontrar un nuevo proyecto que parece bastante flexibles:
http://github.com/pvande/differ/tree/master
Ponerlo a prueba y tratarán de colocar algún tipo de informe.
Tuve la misma duda y la solución que encontré no es 100% rubí, pero es lo mejor para mí. El problema con diff.rb es que no tiene un formateador bonito, para mostrar los difs de una manera humanizada. Así que utilicé diff desde el sistema operativo con este código:
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
llegué frustrado con la falta de una buena biblioteca para esto en rubí, así que escribí http://github.com/samg/diffy. Utiliza diff
debajo de las cubiertas, y se enfoca en ser conveniente y proporcionar opciones de salida bonitas.
Estoy usando diffy para uno de mis proyectos. Simplemente funciona. Gracias. – ardsrk
Tal Array.diff a través de mono-parche ayuda ...
http://grosser.it/2011/07/07/ruby-array-diffother-difference-between-2-arrays/
sólo para el beneficio de las personas de Windows: Diffy se ve brillante, pero me creer que sólo funcionará en * nix (corríjanme si Me equivoco). Ciertamente no funcionó en mi máquina.
Differ funcionó para mí (Windows 7 x64, Ruby 1.8.7).
Ahora hay algo de soporte de Windows horneado. Hay algunos detalles sobre qué tipo de configuración debe hacer en el archivo README. https://github.com/samg/diffy#on-windows – samg
Para obtener el caracter en la resolución personaje que añade una nueva función a 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"]
o con el análisis:
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. Android string-array a Array
- 2. JSONArray a string array
- 3. ¿Qué significa array * string en Ruby?
- 4. Split String en String array
- 5. Word Array to String
- 6. object to string array
- 7. ¿Cómo convierto un Array [String] a un Set [String]?
- 8. convert string array a la cadena
- 9. Convertir array MD5 a String java
- 10. ¿Cómo puedo convertir DataRow a string Array?
- 11. Objeto Ruby String vacío o no?
- 12. PHP Array to String equivalent
- 13. ruby array internal
- 14. Ruby regex matching strings from a array?
- 15. Ruby Array find_first object?
- 16. String to Char array Java
- 17. ruby rails convertir params a int array
- 18. Struct Array Initialization and String Literals
- 19. Perl substr (STRING, @ARRAY) ne substr (STRING, OFFSET, LENGTH)?
- 20. C++ copy std :: string a char array sin terminación nula
- 21. Aumento de copia :: array <char> a std :: string
- 22. Convertir el conjunto de resultados de Java a String array
- 23. Excel VBA: Rango a String Array en 1 paso
- 24. ¿Es posible restringir un parámetro de tipo genérico a String O Array
- 25. numpy array of chars to string
- 26. Cast Dictionary KeyCollection to String array
- 27. Ruby - Diferencia entre Array # << y Array # push
- 28. Cómo buscar una cadena en String array
- 29. delphi array of string stringlist conversion
- 30. array [byte] a HBITMAP o CBitmap
he reformulado esta pregunta con la esperanza de que ahora puede volver a abrirse. Creo que la pregunta era válida, simplemente redactada de una manera que hacía parecer que daría lugar a muchas respuestas de opinión. Si desea ayudar a reabrir esto, debería ver un pequeño enlace de "reabrir" justo debajo de las etiquetas de pregunta "ruby" y "diff". – Gerry
esta es la décima pregunta que he encontrado esta semana que se ha marcado como fuera del tema. no está fuera del tema es una gran pregunta. por favor, monitores de pasillo, dejen de hacer esto. – user1130176
Para cadenas puede utilizar esta respuesta http://stackoverflow.com/a/42573286/745489 – Dzmitry