Вот реализация этого, которую я использовал, чтобы выбрать специальные строки замены из контента и локализовать их.
protected string FindAndTranslateIn(string content)
{
return Regex.Replace(content, @"\{\^(.+?);(.+?)?}", new MatchEvaluator(TranslateHandler), RegexOptions.IgnoreCase);
}
public string TranslateHandler(Match m)
{
if (m.Success)
{
string key = m.Groups[1].Value;
key = FindAndTranslateIn(key);
string def = string.Empty;
if (m.Groups.Count > 2)
{
def = m.Groups[2].Value;
if(def.Length > 1)
{
def = FindAndTranslateIn(def);
}
}
if (group == null)
{
return Translate(key, def);
}
else
{
return Translate(key, group, def);
}
}
return string.Empty;
}
От делегата оценщика совпадений вы возвращаете все, что хотите заменить, поэтому, если я получу возврат, у вас будут полужирные теги и вызов кодирования, мой также поддерживает рекурсию, поэтому немного сложнее для ваших нужд, но вы можете просто сократить пример для ваших нужд.
Это эквивалентно выполнению итерации по сбору совпадений и выполнению частей задания методов замены. Это просто сохраняет вам некоторый код, и вы можете использовать причудливый делегат shmancy.