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

时间:2014-04-28 21:12:02

标签: c#

我需要使用街道地址,只需要地址行,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");

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

5 个答案:

答案 0 :(得分:1)

地址规范化是一个非常棘手的主题。如果您需要符合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

答案 1 :(得分:1)

您希望使用此令牌化和解析地址的codeplex项目:

http://usaddress.codeplex.com/

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

答案 2 :(得分:0)

我会为此

使用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;
            }));

答案 3 :(得分:0)

您可以在循环中使用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();
}

答案 4 :(得分:0)

你正在使用替换的正确轨道,但我会像其他人一样推荐一个在循环内部有查找和替换的字典。见下文:

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;
}

这也可以避免替换可能无意中替换的“组合令牌”。诸如&#34; 101 Northbridge Way&#34;等词。当然,您必须自己编写大写和间距规则:)