我正在尝试自动执行通常手动完成的过程。有一个充满了唯一密钥的数据库,每季度更新一次。此更新将具有一些相同的确切密钥,有时它不会,但它们将是相似的。他们会在前面和后面添加一些东西或添加一些零。以下是一些已经建立的密钥及其匹配的示例:
0509000004 - > 594
0509000005 - > 595
0509000006 - > 596
0510000003 - > 5103
0311100000004000 - > 099031110000000400
0311100000004020 - > 099031110000000402
063050000100 - > 63500100
06308C000400 - > 638C0400
因此,您可以看到密钥更改方式总是存在差异,下次获取数据时,可能会有更多变化。我希望我可以告诉数据提供商停止更改它,但这不取决于我。
我尝试过使用Levenshtein Distance算法,比如模糊搜索和某些数字的剥离,但由于变化很大,它并不总是正确。
任何建议都将不胜感激!
答案 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;
}
}
}