字符串近似

时间:2015-07-02 15:34:35

标签: c# string approximation

我正在尝试自动执行通常手动完成的过程。有一个充满了唯一密钥的数据库,每季度更新一次。此更新将具有一些相同的确切密钥,有时它不会,但它们将是相似的。他们会在前面和后面添加一些东西或添加一些零。以下是一些已经建立的密钥及其匹配的示例:

0509000004 - > 594

0509000005 - > 595

0509000006 - > 596

0510000003 - > 5103

0311100000004000 - > 099031110000000400

0311100000004020 - > 099031110000000402

063050000100 - > 63500100

06308C000400 - > 638C0400

因此,您可以看到密钥更改方式总是存在差异,下次获取数据时,可能会有更多变化。我希望我可以告诉数据提供商停止更改它,但这不取决于我。

我尝试过使用Levenshtein Distance算法,比如模糊搜索和某些数字的剥离,但由于变化很大,它并不总是正确。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

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*)", "$1$2$3$4"),
    new Tuple<string, string>( "^(03111)(0+)([4]\\d{2})0$", "099$1$2$3"),
};

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;
        }
    }
}