Ruby diff两个字符串并组成相同的部分数组

时间:2013-05-03 06:57:06

标签: ruby

使用Ruby,我如何获得两个字符串之间的差异,然后使用相同的部分作为基础来分割其余部分?

对于示例,我有两个字符串(并非所有字符串都具有此格式):

String1 = "Computer: Person1, Title: King, Phone: 555-1212"
String2 = "Computer: PersonB, Title: Queen, Phone: 123-4567"

我希望能够比较(差异)两个字符串,以便得到结果:

["Computer: ",", Title:",", Phone:"]

然后使用它来重新分析原始字符串以获取:

["Person1","King","555-1212"] and ["PersonB","Queen","123-4567"]

我可以使用前一个数组在db / storage中标记。

是否有这样做的功能以及如何实现这些结果?

这个目的不需要事先了解格式化。这样,仅分析数据以进行图案化,然后将其分开。它可以是逗号分隔,新行,间隔等等。

我正在寻找gem“diffy”和“diff-lcs”,看看他们是否可以帮助解决这个问题。

4 个答案:

答案 0 :(得分:1)

我认为你需要的只是一个哈希,哈希你可以做任何奇特的事情。

>> String1 = "Computer: Person1, Title: King, Phone: 555-1212"
>> a = String1.gsub(/[^\s\:]/) { |w| "\"#{w}\"" }
>> a.insert(0, "{")
>> a.insert(-1, "}")
>> a1 = JSON.parse(a)
>> #=> {
    "Computer" => "Person1",
    "Title" => "King",
    "Phone" => "555-1212"
   }

然后您可以请求您想要的内容,例如

>> a1["Computer"]
>> #=> "Person1"

添加

您可以将其抽象为进一步的方法

def str_to_hash(str)
  ouput = str.gsub(/[^\s\:]/) { |w| "\"#{w}\"" }
  output.insert(0, "{").insert(-1, "}")
  JSON.parse(out)
end

>> h2 = str_to_hash(String2)
>> h2["Computer"]
>> #=>"PersonB"

答案 1 :(得分:1)

String1 = "Computer: Person1, Title: King, Phone: 555-1212"
String2 = "Computer: PersonB, Title: Queen, Phone: 123-4567"

keys = String1.split - (String1.split - String2.split)

values = String1.split - keys

您需要找到适合您的特定数据进行拆分的方法。例如,如果允许值包含双引号内的空格,则可以使用.split(/"?[^ ]*\ ?[^ ]*"?/)之类的内容,但是没有通用的解决方案可以处理任何类型的数据。

然后你需要清理结果值。

答案 2 :(得分:0)

鉴于这些字符串,我宁愿按,拆分列,然后使用:之前的部分作为列的名称。

有一个longest common subsequence problem,它有一些事情可做,但不够聪明,无法处理数据的语义。

答案 3 :(得分:0)

s1 = String1.split(' ')
s2 = String2.split(' ')

s1 - s2
=> ["Person1,", "King,", "555-1212"]

s2 - s1
=> ["PersonB,", "Queen,", "123-4567"]