文字列を正規表現で検索して
それを条件に合わせて置換というのをやりたいんですが

例:ABACDからB、C、Dを検索してE、F、Gに置換→AEAFG

string str = "ABACD";
Regex reg = new Regex("B|C|D");
MatchCollection mc = reg.Matches(str);
foreach(Match m in mc) str = reg.Replace(str, func(m.Value), 1, m.Index);

string func(string s)
{
if (s == "B") s = "E";
if (s == "C") s = "F";
if (s == "D") s = "G";
return s;
}

これだと同じ検索をMatchesとReplaceで2回やってて無駄な感じがします・・・
検索がヒットするたびにfuncを実行して置換するようなやり方はないでしょうか