2

こんにちは、私は C# 文字列を持っています。複数のパターンを照合し、見つかった場合は削除する必要があります。

私はこれをやった、それは動作します:

                    sede.Address = Regex.Replace(sede.Address, @"^(?i)str\.*", "Strada");
                    sede.Address = Regex.Replace(sede.Address, @"^(?i)fraz\.*", "Frazione");
                    sede.Address = Regex.Replace(sede.Address, @"^[^vV]\.*\w{2}\s", "");

                    sede.Address = Regex.Replace(sede.Address, @"\w+\.\w*", "");

これを行うより良い方法はありますか?

4

2 に答える 2

1

唯一の簡単な改善は、毎回新しい正規表現を作成するのではなく、正規表現をコンパイルして再利用できるように保存することです。代替パターンを組み合わせると、コードが読みにくくなります。ほとんどの正規表現の実装では、正規表現は適用して適用するa|bよりも高速ではありません。はい、2回ループしますが、各キャラクターで半分の作業を行うため、最初の概算ではウォッシュです。もちろん、それが重要な場合は、実際のデータで測定する以外に方法はありません。ab

于 2013-11-05T19:04:24.963 に答える
1

必要なことを行うための別のより良い方法は、すべてのパターンを構成し、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 回だけ行われるため)。ただし、置換が独立している場合にのみ適用できます。それ以外の場合は、元のコードを保持する必要があります。

于 2013-11-05T18:51:23.507 に答える