有效地检测列表中的匹配项

时间:2013-02-23 23:43:10

标签: .net pattern-matching

我有一个类似于...的有声读物部分列表。

20,000 Leagues Under The Sea
A Tale of Two Cities Part 1 of 2
A Tale of Two Cities Part 2 of 2
A Canterbury Tale 1
A Canterbury Tale 2
Great Expectations

而我正试图将列表折叠为类似于Db规范化...

20,000 Leagues Under The Sea
    (Parts = {"20,000 Leagues Under The Sea"})
A Tale of Two Cities
    (Parts = {"A Tale of Two Cities Part 1 of 2", "A Tale of Two Cities Part 2 of 2"})
A Canterbury Tale
    (Parts = {"A Canterbury Tale 1", "A Canterbury Tale 2"})
Great Expectations
    (Parts = {"Great Expectations"})

现在,我可以提取所有以某些数字模式结尾的条目,但我需要处理多种格式(1/21 of 22) 。删除数字后,我可以删除任何可选的“部分”,

但这一切看起来都很笨重。感觉应该有一种更好的方法来识别群体 - 可能是“查找仅在最后n个字符中有所不同的条目”的内容?

有人可以用优雅的方式指出我吗?

1 个答案:

答案 0 :(得分:1)

如果你的5-6线kluge工作,为什么不保留它?

在一般情况下,这是一个相当困难的问题,因为有很多不同的方式来标记不同的剧集。我们在某种程度上通过YouTube视频解决了这个问题,但它远非完美。正如你所说,有许多不同的格式,虽然它们采用两种一般形式之一:

<name><episode>
<episode><name>

是图书/视频系列的名称,可以采用多种形式。但即使那些通常是

[word]<epidose-number>[of][<total-episodes>]

[word]是可选的,可以是几个单词中的任何一个:“part”,“episode”,“installment”,“scene”等。[of]通常存在,通常是“of”,“/”, “ - ”等。有时作者会混合同一系列的格式。命名不一致会使问题进一步复杂化。所以你会看到:

My vacation, part 1 of 3
Vacation, tape 2
Part 3 of my vacation

如果您可以标准化您的剧集命名和编号,问题就会变得更容易解决。我们到达的解决方案使用了字典,但您可以通过排序来完成。我们的解决方案基本上是:

  • 对于每个视频,导出名称和剧集编号。 (我们使用了自定义解析器和一些启发式方法,但是如果不同的剧集编号方案的数量相当小,你可以使用正则表达式。对我们来说更难的部分是匹配名称,但如果你认为没有拼写错误这些名字很容易处理。)
  • 从这两个数据中创建对象实例
  • 将该实例添加到所有项目列表中

一旦我们这样做,按名称和剧集对列表进行排序就很简单了。

您选择的解决方案完全取决于数据的清洁程度。如果它只有少数不同的剧集格式相当干净,我强烈建议使用正则表达式解决方案。