Вы можете делать это с помощью регулярных выражений, это просто не самый эффективный способ сделать это, так как вам нужно сканировать строку несколько раз.
while (s.Contains("{")) {
s = Regex.Replace(s, @"([^\s{}]+)\s*\{([^{}]+)\}", match => {
return Regex.Replace(match.Groups[2].Value,
@"\s*(.*\n)",
match.Groups[1].Value + ".$1");
});
}
Результат:
A.B.C = D
A.B.E = F
A.G = H
Я все еще думаю, что использование парсера и / или стекового подхода - лучший способ сделать это, но я просто подумал, что предложу альтернативу.