我有一系列格式正确的电话号码:
string[] phoneNumbers = {"US +1 866 XXX XXXX",
"UK +44 (0)XXX XXX XXXX",
"Singapore +65 XXXX XXXX"
};
我输入的电话号码对应于列表中的其中一个项目,但格式略有不同。输入可以是这些中的一个。注意,开头的国家名称不包括在内。
如您所见,我的输入格式与数组略有不同。
我的问题是,当我有一个格式不同的输入时,从数组中提取正确格式化数字版本的好方法是什么。
我不是要求别人为我这样做,因为我可以做好代码。这个逻辑让我现在有些原因。
我想到的是一个并行电话号码数组,其中包含所有错误格式化的输入,并获取该数组中项目的索引并获得正确数组的相应输入。这看起来合乎逻辑吗?有更好,更快的方式吗?
修改
目前我正在完成这项工作:
for(int i=0; i<phoneNumbers.Count(); i++)
{
var tempDialInNumber = (from t in input //input from the user
where char.IsDigit(t)
select t).ToArray();
string tDialInNumber = new string(tempDialInNumber);
var tempDigitPhoneNumber = (from t in phoneNumbers.GetValue(i).ToString()
where char.IsDigit(t)
select t).ToArray();
string tDigitPhoneNumber = new string(tempDigitPhoneNumber);
if (tDigitPhoneNumber.Contains(tDialInNumber))
{
dialInNumber = phoneNumbers.GetValue(i).ToString();
}
}
答案 0 :(得分:2)
这样做的规范方法是:
答案 1 :(得分:1)
我会尝试使用此http://en.wikipedia.org/wiki/Levenshtein_distance第一个。
根据错误率,我会通过对组中的字符串进行预分类来调整算法(您可以使用正则表达式来生成字符串类)以及使用Levenshtein比较内部类。
另一种方法是根据字符串模式创建Bloom filter,然后使用它来匹配您想要的字符串。我不确定它是否能在你的情况下更好地运作。
答案 2 :(得分:1)
看起来如果忽略'+'和括号以及前导1和空格,那么您将获得前导2或3位数到国家/地区代码集的匹配。所以你可以删除'+'和括号和空格并引导'1'1并查看前导数字匹配的前导国家代码,然后检查尾随数字的数量是否与您对该国家的预期相符(否则匹配的国家/地区)是'未知')。请注意,如果国家/地区代码以“1”开头,则该国家/地区的主要代码有两种可能的匹配项。此外,如果数字计数与美国数字计数匹配且一个国家/地区不匹配,则它是美国数字。然后,一旦您知道了国家/地区,就可以将电话号码的数字放入该国家/地区的标准模板中,并根据需要将国家/地区的名称放在前面。