Сведения о вопросе

FELL

20:44, 15th August, 2020

Теги

c#   .net    

Лучший способ заменить токены в большом текстовом шаблоне

Просмотров: 412   Ответов: 10

У меня есть большой текстовый шаблон, который нуждается в маркированных разделах, замененных другим текстом. Маркеры выглядят примерно так: ##USERNAME##. мой первый инстинкт-просто использовать String.Replace(), но есть ли лучший, более эффективный способ или Replace() уже оптимизирован для этого?



  Сведения об ответе

SILA

11:14, 20th August, 2020

System.Text.RegularExpressions.Regex.Replace() - это то, что вы ищете - IF ваши жетоны настолько странны, что вам нужно regex, чтобы найти их.

Какая-то добрая душа провела небольшое тестирование производительности , и между Regex.Replace(), String.Replace() и StringBuilder.Replace(), String.Replace() фактически вышел на первое место.


  Сведения об ответе

LIZA

06:29, 29th August, 2020

Единственная ситуация, в которой мне пришлось это сделать,-это отправить шаблонное электронное письмо. В .NET это предусмотрено из коробки классом MailDefinition . Вот как вы создаете шаблонное сообщение:

MailDefinition md = new MailDefinition();
md.BodyFileName = pathToTemplate;
md.From = "test@somedomain.com";

ListDictionary replacements = new ListDictionary();
replacements.Add("<%To%>", someValue);
// continue adding replacements

MailMessage msg = md.CreateMailMessage("test@someotherdomain.com", replacements, this);

После этого msg.Body будет создан путем замены значений в шаблоне. Я думаю, что вы можете посмотреть на MailDefinition.CreateMailMessage() с отражателем:). Извините, что я немного не в теме, но если это ваш сценарий, я думаю, что это самый простой способ.


  Сведения об ответе

LAST

17:40, 11th August, 2020

Ну, в зависимости от того, сколько переменных у вас есть в вашем шаблоне, сколько шаблонов у вас есть и т.д. это может быть работа для полного процессора шаблонов. Единственное , что я когда-либо использовал для .NET, - это NVelocity, но я уверен, что там должно быть множество других, большинство из них связано с той или иной веб-платформой.


  Сведения об ответе

lourence

06:07, 24th August, 2020

string.Replace-это хорошо. Я бы предпочел использовать Regex, но я *** для регулярных выражений.

Важно иметь в виду, насколько велики эти шаблоны. Если он действительно большой, а память-это проблема, вы можете создать пользовательский маркер, который действует на поток. Таким образом, вы удерживаете в памяти только небольшую часть файла, пока манипулируете им.

Но для наивной реализации string.Replace должно быть прекрасно.


  Сведения об ответе

pumpa

21:16, 15th August, 2020

Если вы делаете несколько замен на больших строках, то, возможно, лучше использовать StringBuilder.Replace(), так как появятся обычные проблемы с производительностью строк.


  Сведения об ответе

nYU

20:46, 24th August, 2020

Пришлось делать что-то подобное совсем недавно. То, что я сделал, было:

  • создайте метод, который принимает словарь (ключ = имя токена, значение = текст, который нужно вставить)
  • Получите все совпадения с вашим форматом токена (##.+?## в вашем случае я думаю, что не очень хорошо разбираюсь в регулярных выражениях: P) используя Regex.Matches(input, регулярное выражение)
  • foreach по результатам, используя словарь, чтобы найти значение вставки для вашего токена.
  • возвращаемый результат.

Сделано ;-)

Если вы хотите проверить свои регексы, я могу предложить регулятор.


  Сведения об ответе

fo_I_K

09:54, 16th August, 2020

Регулярные выражения были бы самым быстрым решением для кодирования, но если у вас есть много разных токенов, то это будет медленнее. Если производительность не является проблемой, то используйте этот параметр.

Лучше всего было бы определить маркер, например, ваш "##", который вы можете сканировать в тексте. Затем выберите то, что нужно заменить из таблицы hash текстом, который следует за маркером в качестве ключа.

Если это часть сценария сборки, то nAnt имеет отличную функцию для этого, называемую цепочками фильтров . Код для этого является открытым исходным кодом, поэтому вы можете посмотреть, как это делается для быстрой реализации.


  Сведения об ответе

nYU

21:06, 1st October, 2020

FastReplacer реализует замену токена в O(n*log(n) + m) времени и использует 3x память исходной строки.

FastReplacer хорошо подходит для выполнения многих операций замены в большой строке, когда важна производительность.

Основная идея заключается в том, чтобы избежать изменения существующего текста или выделения новой памяти при каждой замене строки.

Мы разработали FastReplacer, чтобы помочь нам в проекте, где нам нужно было создать большой текст с большим количеством операций добавления и замены. Первая версия приложения заняла 20 секунд, чтобы сгенерировать текст с помощью StringBuilder. Вторая улучшенная версия, которая использовала класс String, заняла 10 секунд. Затем мы внедрили FastReplacer, и продолжительность снизилась до 0.1 секунд.


  Сведения об ответе

ITSME

12:57, 11th August, 2020

Если ваш шаблон большой и у вас есть много маркеров, вы, вероятно, не хотите ходить по нему и заменять маркер в шаблоне один за другим, так как это приведет к операции O(N * M), где N-размер шаблона, а M-количество маркеров для замены.

Следующий метод принимает шаблон и словарь пар значений ключей, которые вы хотите заменить. При инициализации StringBuilder немного больше, чем размер шаблона, это должно привести к операции O(N) (т. е. он не должен расти сам по себе лог N раз).

Наконец, вы можете переместить построение токенов в Singleton, поскольку оно должно быть сгенерировано только один раз.

static string SimpleTemplate(string template, Dictionary<string, string> replacements)
{
   // parse the message into an array of tokens
   Regex regex = new Regex("(##[^#]+##)");
   string[] tokens = regex.Split(template);

   // the new message from the tokens
   var sb = new StringBuilder((int)((double)template.Length * 1.1));
   foreach (string token in tokens)
      sb.Append(replacements.ContainsKey(token) ? replacements[token] : token);

   return sb.ToString();
}


  Сведения об ответе

COOL

21:06, 1st October, 2020

Это идеальное использование регулярных выражений. Ознакомьтесь с этим полезным веб-сайтом, классом регулярных выражений .Net и этой очень полезной книгой по освоению регулярных выражений .


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться