Следующий код отличается от других ответов тем, что в нем используется жадное сопоставление (". *?"):
private static void Main(string[] args) {
const string input = "Warning: the error {0} has occurred. {1, 9} module has {2:0%} done.";
const string pattern = "{.*?}"; // NOTE: "?" is required here (non-greedy matching).
var formattingParts = Regex.Matches(input, pattern).Cast<Match>().Where(item => item.Success).Select(item => item.Groups[0].Value);
foreach (var part in formattingParts) {
Console.WriteLine(part);
}
}