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; } 
'-'and'='), or at least some rule that defines a delimeter (i.e. any non-alphanumeric character)?List<KeyValuePair>? It would be extremely helpful to see what you have done so far so we can see where it's not working.