Вы можете разобрать шаблон с помощью регулярных выражений.Подобное выражение будет соответствовать каждому определению поля и разделителю:
Match m = Regex.Match(template, @"^(\[%(?<name>.+?)%\](?<separator>.)?)+$")
Соответствие будет содержать две именованные группы для (имя и разделитель), каждая из которых будет содержать количество захватов для каждого совпадения ввходная строка.В вашем примере группа разделителей будет иметь на один захват меньше, чем группа имен.
Затем можно выполнить итерацию по захватам и использовать результаты для извлечения полей из входной строки и сохранения значений, например, так::
if( m.Success )
{
Group name = m.Groups["name"];
Group separator = m.Groups["separator"];
int index = 0;
Dictionary<string, string> fields = new Dictionary<string, string>();
for( int x = 0; x < name.Captures.Count; ++x )
{
int separatorIndex = input.Length;
if( x < separator.Captures.Count )
separatorIndex = input.IndexOf(separator.Captures[x].Value, index);
fields.Add(name.Captures[x].Value, input.Substring(index, separatorIndex - index));
index = separatorIndex + 1;
}
// Do something with results.
}
Очевидно, что в реальной программе вам придется учитывать неверный ввод и тому подобное, чего я здесь не делал.