Это даст вам то, что вам нужно, в два этапа:
IEnumerable<string[]> captures =
// Get the 'single quoted' tokens
Regex.Matches(s, "'[^']*'").Cast<Match>()
// Split each token by { blocks }, but keep the curly braces.
.Select(quoteMatch => Regex.Split(quoteMatch.Value, @"(?<=\{)[^{}]*(?=\})"))
.ToArray();
Результатом является коллекция массивов строк - каждая коллекция - это «совпадение», а каждая строка - «группа».
Можно сделать все это в одном регулярном выражении .Net, но это не очень красиво и с ним гораздо сложнее работать. Вот рабочее решение: http://ideone.com/qaceF, но я не думаю, что это правильный ответ на вопрос, когда есть гораздо более простые альтернативы.