It s not clear to me if this example represents a potential infinite nesting of these JSON-esque groups, or just one level of nesting.
If only one level of nesting is possible, a straightforward Regex will do:
(Please note I did not write this with an IDE; the concept should be correct but syntax errors can t be guaranteed at the moment. Apologies)
string pattern = @"(?<key>)[A-Z]+)s(?<value>({.+?}|[^{},]+))";
List<string[]> results = new List<string[]>(); //probably not best data structure
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.SingleLine | RegexOptions.IgnoreCase);
foreach(Match match in matches)
{
if(match.Success)
{
results.Add(new string[] {
match.Groups["key"].Value,
match.Groups["value"].Value
});
}
}
If they can be nested many levels, you probably want to approach this recursively. That would necessitate splitting the value match into nested value and simple value:
string pattern = @"(?<key>)[A-Z]+)s({(?<nested>.+?)}|(?<simple>[^{},]+))";
And for each match where nested has a value, execute the same routine against that value:
void Deserialize(string input, List<string[]> values)
{
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.SingleLine | RegexOptions.IgnoreCase);
foreach(Match match in matches)
{
if(match.Success)
{
if(match.Groups["nested"].Success && !string.IsNullOrEmpty(match.Groups["nested"].Value))
{
Deserialize(match.Groups["nested"].Value, values);
}
else
{
values.Add(new string[] {
match.Groups["key"].Value,
match.Groups["simple"].Value
});
}
}
}
}