【发布时间】:2015-06-06 06:26:02
【问题描述】:
我需要一种算法,该算法可以在数据中找到预定义的模式(以字符串的形式存在),而与数据和模式的实际符号/字符无关。我只关心符号之间的关系,而不关心符号本身。数据中的相同符号具有不同的模式符号也是合法的。模式匹配算法必须强制执行的唯一事情是保留模式中相同符号的多次出现。举个例子:
模式是abca,所以第一个和最后一个字母是一样的。对于我的应用程序,写它的等效方法是 1 2 3 1,其中数字只是变量。我拥有的数据是 thistextisatest。生成的算法应该在这里给我两个正确的匹配,text 和 test。因为只有在这两种情况下,第一个和第四个字母是相同的,就像在模式中一样。
作为第二个示例,模式 abcd 应返回 12 个匹配项(此文本中的每个位置一个匹配项)。由于模式中没有变量是重复的,所以它在任何地方都是平凡匹配的。即使在 text 和 test 的情况下,因为模式的变量 a 和 d 是合法的映射到同一个符号。
该算法的目标应该是检测书面语言中的相似性。想象一下,有一本英语词典,并用 unseen 或等效的 1 2 3 4 4 2 模式对其进行解析。然后您会看到,例如,单词 belittle 包含相同的字母模式。
所以,既然我希望清楚我需要什么,我有一些问题:
这个算法叫什么?这是一个众所周知的问题已经解决了吗?
是否有关于此事的出版物?当您不知道正确的搜索词来将此问题与常规模式匹配区分开来时,真的很难找到任何有用的东西。
- 是否有现成的实现方式?
我没有将正则表达式用于任何太复杂的事情,所以我不知道在正则表达式中是否有可能发生这样的事情,因为你基本上不关心符号本身,而只考虑它们出现的模式.
非常感谢您的帮助!
【问题讨论】:
-
这很有趣。但是,您可以将所有这些与正则表达式匹配。首先,
(.).{2}\1(或((.).{2}\2)以更好地捕获文本)将返回“测试”和“文本”(regex101.com/r/cV7bD1/3),其次,(?=(.{4}))将返回您感兴趣的 12 个匹配项(regex101.com/r/cV7bD1/2)。因此,重点可能是将模式转换为数字、检查重复数字并创建相应的正则表达式。 -
我理解你的建议,但如果我必须从每个模式(其中将有数百万个模式)生成一个正则表达式,这对我来说似乎是最后的方法。当然,拥有某种可以处理所有实例的通配符正则表达式(或完全独立的算法)会更方便。
标签: regex algorithm language-agnostic pattern-matching