[英]Comparing strings based on similarity?
我有一組格式正確的電話號碼:
string[] phoneNumbers = {"US +1 866 XXX XXXX",
"UK +44 (0)XXX XXX XXXX",
"Singapore +65 XXXX XXXX"
};
我輸入的電話號碼與列表中的這些項目之一相對應,但是其格式略有不同。 輸入可以是這3個輸入之一。請注意,不包括開頭的國家/地區名稱。
如您所見,我的輸入格式與數組略有不同。
我的問題是,當我有格式不同的輸入時,從數組中提取數字的正確格式版本的好方法是什么?
我沒有要求別人為我做這件事,因為我可以做得很好。 出於某種原因,這種邏輯使我立即陷入困境。
我考慮過的事情是,使用並行電話號碼數組,其中包含所有格式錯誤的輸入,並獲取該數組中該項的索引,並獲取正確數組的相應輸入。 這看起來合乎邏輯嗎? 有沒有更好,更快的方法?
編輯:
目前,我正在完成此工作:
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();
}
}
做到這一點的規范方法是:
我會嘗試使用此http://en.wikipedia.org/wiki/Levenshtein_distance 1st。
根據錯誤率,我將通過對字符串進行預分類來優化算法(可以使用正則表達式生成字符串類),然后使用Levenshtein在類內部進行比較。
另一種方法是基於字符串模式創建Bloom過濾器 ,然后使用它與所需的字符串進行匹配。 我不確定這是否能更好地解決您的問題。
似乎如果您忽略'+'和括號以及前導1和空格,那么您將獲得國家代碼集中前2或3位數字的匹配項。 因此,您只需刪除“ +”,括號和空格以及前導“ 1” 1,然后查看前導數字與哪個前導國家/地區代碼匹配,然后檢查后綴數字的數量是否與您對該國家/地區的期望匹配(否則匹配的國家/地區)是“未知”)。 請注意,如果國家/地區代碼以“ 1”開頭,則該國家/地區的領先代碼可能有兩個匹配項。 同樣,如果數字計數與美國數字計數匹配,並且一個國家/地區不匹配,則它是美國數字。 然后,一旦您知道國家/地區,就可以將電話號碼的數字放入該國家/地區的標准模板中,然后根據需要將國家/地區的名稱放在前面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.