0

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

例如我有两个字符串(并非所有字符串都具有这种格式):

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

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

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

然后使用它重新解析原始字符串以获得:

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

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

是否有功能可以做到这一点,我将如何实现这些结果?

这样做的目的是不需要格式化的先验知识。这样,只需分析数据以进行图案化,然后按此方式划分。它可以是逗号分隔、换行、间隔等。

我正在查看 gem "diffy" 和 "diff-lcs" 看看它们是否有助于将其分开。

4

4 回答 4

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"
于 2013-05-03T07:52:07.270 回答
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(/"?[^ ]*\ ?[^ ]*"?/)内容,但没有通用的解决方案可以处理任何类型的数据。

然后你需要清理结果值。

于 2013-05-03T07:52:46.137 回答
0

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

有一个最长的公共子序列问题,它有事情要做,但不够聪明,无法处理数据的语义。

于 2013-05-03T07:15:06.433 回答
0
s1 = String1.split(' ')
s2 = String2.split(' ')

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

s2 - s1
=> ["PersonB,", "Queen,", "123-4567"]
于 2013-05-03T08:44:08.387 回答