与符号无关的字符串的模式匹配

时间:2015-04-01 14:34:41

标签: regex algorithm language-agnostic pattern-matching

我需要一种算法,该算法可以在数据中找到预定义的模式(以字符串的形式存在),与数据和模式的实际符号/字符无关。我只关心符号之间的关系,而不是符号本身。在数据中为相同的符号设置不同的模式符号也是合法的。模式匹配算法必须强制执行的唯一事情是保留模式中相同符号的多个出现。举个例子:

模式是 abca ,因此第一个和最后一个字母是相同的。对于我的应用程序,写这个的等效方法是 1 2 3 1 ,其中数字只是变量。我的数据是 thistextisatest 。结果算法应该在这里给我两个正确的匹配,文本测试。因为只有在这两种情况下,第一个和第四个字母是相同的,就像在模式中一样。

作为第二个例子,模式 abcd 应该返回12个匹配(thistextisat中每个位置一个)。由于模式中没有变量重复,因此在任何地方都可以轻松匹配。即使在文本测试的情况下,因为模式的变量 a d 是合法的映射到相同的符号。

该算法的目标应该是检测书面语言的相似之处。想象一下,有一个英语词典,并用看不见或等效 1 2 3 4 4 2 模式解析它。然后,您会看到,例如, belittle 一词包含相同的字母模式。

所以,既然我希望明确我需要什么,我有一些问题:

  • 这个算法叫什么?这是一个已经解决的众所周知的问题吗?

  • 是否有关于此事的出版物?当你不知道正确的搜索术语来将这个问题与常规模式匹配分开时,很难找到任何有用的东西。

  • 这是否已经准备好了?

我没有使用Regex来处理任何过于复杂的事情,所以我不知道在Regex中是否还有这样的事情,当你基本上不关心这些符号时,只考虑它们出现的模式

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我认为你不需要正则表达式。您的搜索字词:

unseen
123442

这有六个字符,因此请将文字的每个单词编入6-mers

贬低

12,12,12,12,11,12,12 2-mers
123,123,123,122,112,123 3-mers
1234,1234,1233,1223,1123 4-mers
12345,12344,12334,12234 5-mers
123455,123442,123321 6-mers

所以只看6-mers,你就得到了一场比赛。任何小于搜索词的6位数字也是匹配的,以允许abcd(1234)大小写匹配abca(1231)字。

所以给定一个n个字符的搜索词,只需将每个单词分成其组成的n-mers并检查等于或小于的数字。