I need to pull a bunch of key value pairs based on a predefined pattern from a string. An example of what I would need is this:
Pattern: {value1}-{value2}
String: Example-String
Result KVP:
{ Key: value1, value: Example },
{ Key: value2, value: String }
The catch is that the pattern could be pretty much anything (although the values I'd need to extract would always be surrounded in curly brackets), ie:
Pattern: {test1}\{test2}={value}
String: Example\Value=Result
Result KVP:
{ Key: test1, value: Example },
{ Key: test2, value: Value },
{ Key: value, value: Result }
What I have done so far isn't quite working and I'm quite certain that there has to be a more elegant way of doing this as opposed to my solution anyway so I thought I'd see if anyone here would have a good idea.
EDIT:
Here is essentially what I have so far (it's working, but IMO it's really ugly):
public List<KeyValuePair<string, string>> Example(string pattern, string input)
{
    var values = new List<KeyValuePair<string, string>>();
    var r1 = Regex.Matches(input, @"(\{[A-Z,a-z]*\})");
    string newregex = string.Empty;
    foreach (Match item in r1)
    {
        newregex = newregex.Replace(item.Value, "(.*?)"); //updates regex so that it adds this as a group for use later, ie: "{item1}-{item2}" will become "(.*?)-{item2}"
        string field = item.Value.Substring(1, item.Value.Length - 2); // {test1} will return "test1"
        values.Add(new KeyValuePair<string, string>(field, string.Empty));
    }
    newregex = $"{newregex}\\z"; // ensures that it matches to end of input
    var r2 = Regex.Match(input, newregex);
    // KVP index (used below)
    int val = 0;
    foreach (Group g in r2.Groups)
    {
        if (g.Value == input)
            continue; // first group will be equal to input, ignore
        values[val] = new KeyValuePair<string, string>(values[val].Key, g.Value); // update KVP at index with new KVP with the value
        val++;
    }
    return values;
}
