如何拆分街道地址字符串和替换单个元素



我需要取一个街道地址,只需地址行,111 Stackoverflow Drive North就可以拆分单独的stringsreplace特定元素。

例如:我需要替换字符串中的元素,使其看起来像这样:

输入:111 Stackoverflow Drive North输出:111 Stackoverflow Dr N因此,基本上,如果地址行包含Av或Avenue,则替换为Ave

我知道如何做到这一点的唯一方法是背靠背地使用Replace Method

示例:

 string input = "111 Stackoverflow Drive North";
 string address = input.ToLower().Replace("north", "N").Replace("drive", "Dr");

这看起来很冗长:我想创建一个值列表,然后拆分地址并替换,但不确定如何将两者放在一起。

地址规范化是一个非常棘手的主题。如果你需要符合USPS,不要试图自己写。有CASS认证的软件可以完美地做到这一点(成本高昂(,还有许多低成本的解决方案可以很好地做到。

话虽如此,您可以标记输入字符串,然后通过使用替换(如果定义了替换(或使用原始值将值连接在一起。

Dictionary<string, string> replacements = new Dictionary<string, string>()
{
    { "DRIVE", "DR" }
};
string[] tokens = originalAddress.Split(new char[] { ' ', 't' });
StringBuilder normalized = new StringBuilder();
foreach (string t in tokens)
{
    string rep;
    bool found = replacements.TryGetValue(t.ToUpper(), out rep);
    if (found)
    {
        normalized.Append(rep);
    }
    else
    {
        normalized.Append(t);
    }
    normalized.Append(' ');
}
// normalized.ToString() contains the normalized address

您想要使用这个codeplex项目来标记和解析地址:

http://usaddress.codeplex.com/

然后您可以访问各种信息。

我会为这个使用Dictionary

var dict = new Dictionary<string, string> {{"north", "N"}, {"drive", "Dr"}};
string address = string.Join(" ",
            input.Split().Select(x =>
            {
                if (dict.ContainsKey(x.ToLower())) 
                     return dict[x.ToLower()];
                return x;
            }));

您可以在循环中使用StringBuilder.Replace,例如使用以下方法:

public static String ReplaceAll(string original, Dictionary<String, String> replacements)
{
    var sb = new StringBuilder(original);
    foreach (var kv in replacements)
    {
        sb.Replace(kv.Key, kv.Value);
    }
    return sb.ToString();
}

您使用replace是正确的,但我建议您像其他人一样,在循环中使用一个包含查找和替换的字典。见下文:

Dictionary<string, string> replacementDictionary = new Dictionary<string, string>();
replacementDictionary.Add("north", "N");
replacementDictionary.Add("south", "S");
// Add more entries here

然后,当你有一个有替换问题的地址时,你可以在字典中搜索一个替换条目:

string addressInQuestion = "101 north Almond drive";
string finalAddress;
foreach(string token in addressInQuestion.Split(' '))
{
    string replacementToken = token;
    replacementDictionary.TryGetValue(token, out replacementToken)
    finalAddress += replacementToken;
}

这也将避免替换可能意外替换的"组合代币"单词,如"北桥路101号"。当然,您必须自己编写大写和间距规则:(

最新更新