另一种更好的方法是组合所有模式,做一些Matches
来获取所有匹配项的集合,遍历这个集合并找到确切的模式,然后执行相应的替换:
Dictionary<string,string> subPatterns = new Dictionary<string,string>();
subPatterns[@"^(?i)str\.*"] = "Strada";
subPatterns[@"^(?i)fraz\.*"] = "Frazione";
subPatterns[@"^(?-i)[^vV]\.*\w{2}\s|\w+\.\w*"] = "";
//build the compositing pattern from sub patterns
string pattern = string.Join("|", subPatterns.Select(e=>e.Key));
//replace it
StringBuilder address = new StringBuilder();
int nextStart = 0;
foreach(Match m in Regex.Matches(sede.Address, pattern)){
if(m.Success){
address.Append(sede.Address.Substring(nextStart,m.Index));
//find the replacement
foreach(var pat in subPatterns){
if(Regex.IsMatch(m.Value,pat.Key)){
address.Append(pat.Value);
break;
}
}
nextStart = m.Index + m.Length;
}
}
sede.Address = address.ToString();
注意:上面的代码当然比您的原始代码更好(因为匹配只在循环中通过输入中的所有字符完成一次)。但它仅适用于您的替换是独立的,否则您必须保留原始代码。