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