必要なことを行うための別のより良い方法は、すべてのパターンを構成し、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();
注: もちろん、上記のコードは元のコードよりもうまく機能します (マッチングは、入力内のすべての文字のループ内で 1 回だけ行われるため)。ただし、置換が独立している場合にのみ適用できます。それ以外の場合は、元のコードを保持する必要があります。