字符串近似

String Approximation

我正在尝试使通常由手工完成的过程自动化。有一个充满唯一键的数据库,每季度更新一次。此更新将具有一些完全相同的密钥,有时不会,但它们会相似。他们将在前端和末尾添加一些内容或添加一些零。以下是一些已经建立的密钥及其匹配项的示例:

0509000004 -> 594

0509000005 -> 595

0509000006 -> 596

0510000003 -> 5103

0311100000004000 -> 099031110000000400

0311100000004020 -> 099031110000000402

063050000100 -> 63500100

06308C000400 -> 638C0400

正如您所见,密钥的更改方式总是有变化,下次我获取数据时,它可能会有更多变化。我希望我可以告诉数据提供者停止更改它,但这不取决于我。

我曾尝试使用 Levenshtein 距离算法,如模糊搜索结合某些数字的剥离,但由于变化很大,它并不总是能正确地得到它。

如有任何建议,我们将不胜感激!

这是一个小例子,你只需要维护正则表达式

var list = new[]
    {
        "0509000004", "0509000005", "0509000006", "0510000003", 
        "0311100000004000", "0311100000004020",
        "063050000100", "06308C000400"
    };


var results = new List<string>();

List<Tuple<string, string>> regexes = new List<Tuple<string, string>>{
    new Tuple<string, string>( "^0(5)(?:0(\d)|(\d{1,2}))0*(\d*)", ""),
    new Tuple<string, string>( "^(03111)(0+)([4]\d{2})0$", "099"),
};

foreach (var number in list)
{
    foreach (var regex in regexes)
    {
        if (Regex.IsMatch(number, regex.Item1))
        {
            results.Add(Regex.Replace(number, regex.Item1, regex.Item2));
            break;
        }
    }
}