我需要使用街道地址,只需要地址行,111 Stackoverflow Drive North
分割单个strings
和replace
个特定元素。
例如:我需要替换字符串中的元素,使其如下所示:
输入: 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");
这看起来非常冗长:我正在考虑创建一个值列表然后拆分地址并替换但不确定如何将两者放在一起。
答案 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)
答案 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;等词。当然,您必须自己编写大写和间距规则:)