Regex 高效地查找与简单通配符字符串最匹配的现有字符串

Regex 高效地查找与简单通配符字符串最匹配的现有字符串,regex,string,algorithm,levenshtein-distance,Regex,String,Algorithm,Levenshtein Distance,我有一个作为标识符的字符串表,但是每个标识符可以是固定的,也可以是带有一些静态片段的可变标识符。例如,标识符可以是ABC12345,也可以是DEF**45,其中*表示任何字母数字字符。这个表中有几十万个标识符,我想根据用户输入的内容将输入的字符串与最近的字符串进行匹配。如果用户输入ABC12345-我们都在那里设置,因为它是直接匹配。如果用户输入DEF1245,则需要进行一些计算。我认为Levenshtein距离是一个很好的候选者,因为这将告诉我在这种情况下,需要更改两个字母来复制这个最接近的字

我有一个作为标识符的字符串表,但是每个标识符可以是固定的,也可以是带有一些静态片段的可变标识符。例如,标识符可以是ABC12345,也可以是DEF**45,其中*表示任何字母数字字符。这个表中有几十万个标识符,我想根据用户输入的内容将输入的字符串与最近的字符串进行匹配。如果用户输入ABC12345-我们都在那里设置,因为它是直接匹配。如果用户输入DEF1245,则需要进行一些计算。我认为Levenshtein距离是一个很好的候选者,因为这将告诉我在这种情况下,需要更改两个字母来复制这个最接近的字符串。如果有一个标识符DEF12**,这不会是一个问题,因为两者的距离相同,但这没关系,因为至少我知道这两个选项都是有效的匹配项。问题是,我可能会对数据库中可能存在严重效率问题的数千个字符串进行比较。对我有利的是,长度是一个直接的鉴别器,相同的多个距离不是问题。是否有更有效的方法来处理这些字符串,或者有更好的方法来存储它们以供处理?它看起来几乎像一个反向正则表达式,但我不太明白如何在不将每个标识符转换为正则表达式、测试然后继续的情况下使用它们。它似乎比距离计算效率更低

Levenshtein距离是根据两个句子的字母计算的。此外,没有任何预计算步骤可以加速Levenshtein距离。 由于您具有固定长度,因此可以存储id的所有子集,并根据所有预计算的子集检查用户键入内容的所有子集

用户类型2345,以及子集2、23、234、234、3、34、345等。。。 查找与用户键入的具有相同子集的所有ID,从较长的子集开始:将匹配2345612345 按最长公共SUBSET排序
首先,我不知道这会有多有效。第二点也是最重要的一点是,我认为你们应该检查一下莱文施坦距离是否真的是个问题。根据我的经验,数千次距离计算不足以显著降低搜索速度,除非您的ID更长。首先尝试一下,之后您将处理优化问题

我想您可以将所有这些字符串放在一个字符串中,并使用它来找到一个匹配的字符串。当您进入trie时,*匹配所有内容,但确实会产生一些成本。但是每个标识符可以是固定的,也可以是带有一些静态片段的可变标识符,您如何在该字符串中确切地指出它是可变标识符?标识符中可以是可变的任何部分都用*表示。所有的静态片段都是它们的文字字符。大多数引擎在编译正则表达式时通过交替创建一个TRIE来提高速度。在运行时,我会将所有ID收集到一个列表中,对列表进行排序,用一个dot或al num类[a-z\d]替换所有的*。然后在交替符号|上连接。通过catting^?+创建最终正则表达式字符串已加入id的+$。当引擎编译这个正则表达式时,它所做的是对所有替换进行trie。这立即将选择从数千个减少到26个。时间很短。而且,你能做的因素越多,trie的构建就越好。例如:?:id25 | id26 | id27a |?:ie3 | ie4 | ie5