Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Лучший способ заменить токены в большом текстовом шаблоне
У меня есть большой текстовый шаблон, который нуждается в маркированных разделах, замененных другим текстом. Маркеры выглядят примерно так: ##USERNAME##. мой первый инстинкт-просто использовать String.Replace(), но есть ли лучший, более эффективный способ или Replace() уже оптимизирован для этого?
System.Text.RegularExpressions.Regex.Replace() - это то, что вы ищете - IF ваши жетоны настолько странны, что вам нужно regex, чтобы найти их.
Какая-то добрая душа провела небольшое тестирование производительности , и между Regex.Replace(), String.Replace() и StringBuilder.Replace(), String.Replace() фактически вышел на первое место.
Единственная ситуация, в которой мне пришлось это сделать,-это отправить шаблонное электронное письмо. В .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() с отражателем:). Извините, что я немного не в теме, но если это ваш сценарий, я думаю, что это самый простой способ.
Ну, в зависимости от того, сколько переменных у вас есть в вашем шаблоне, сколько шаблонов у вас есть и т.д. это может быть работа для полного процессора шаблонов. Единственное , что я когда-либо использовал для .NET, - это NVelocity, но я уверен, что там должно быть множество других, большинство из них связано с той или иной веб-платформой.
string.Replace-это хорошо. Я бы предпочел использовать Regex, но я *** для регулярных выражений.
Важно иметь в виду, насколько велики эти шаблоны. Если он действительно большой, а память-это проблема, вы можете создать пользовательский маркер, который действует на поток. Таким образом, вы удерживаете в памяти только небольшую часть файла, пока манипулируете им.
Но для наивной реализации string.Replace должно быть прекрасно.
Пришлось делать что-то подобное совсем недавно. То, что я сделал, было:
- создайте метод, который принимает словарь (ключ = имя токена, значение = текст, который нужно вставить)
- Получите все совпадения с вашим форматом токена (##.+?## в вашем случае я думаю, что не очень хорошо разбираюсь в регулярных выражениях: P) используя Regex.Matches(input, регулярное выражение)
- foreach по результатам, используя словарь, чтобы найти значение вставки для вашего токена.
- возвращаемый результат.
Сделано ;-)
Если вы хотите проверить свои регексы, я могу предложить регулятор.
Регулярные выражения были бы самым быстрым решением для кодирования, но если у вас есть много разных токенов, то это будет медленнее. Если производительность не является проблемой, то используйте этот параметр.
Лучше всего было бы определить маркер, например, ваш "##", который вы можете сканировать в тексте. Затем выберите то, что нужно заменить из таблицы hash текстом, который следует за маркером в качестве ключа.
Если это часть сценария сборки, то nAnt имеет отличную функцию для этого, называемую цепочками фильтров . Код для этого является открытым исходным кодом, поэтому вы можете посмотреть, как это делается для быстрой реализации.
FastReplacer реализует замену токена в O(n*log(n) + m) времени и использует 3x память исходной строки.
FastReplacer хорошо подходит для выполнения многих операций замены в большой строке, когда важна производительность.
Основная идея заключается в том, чтобы избежать изменения существующего текста или выделения новой памяти при каждой замене строки.
Мы разработали FastReplacer, чтобы помочь нам в проекте, где нам нужно было создать большой текст с большим количеством операций добавления и замены. Первая версия приложения заняла 20 секунд, чтобы сгенерировать текст с помощью StringBuilder. Вторая улучшенная версия, которая использовала класс String, заняла 10 секунд. Затем мы внедрили FastReplacer, и продолжительность снизилась до 0.1 секунд.
Если ваш шаблон большой и у вас есть много маркеров, вы, вероятно, не хотите ходить по нему и заменять маркер в шаблоне один за другим, так как это приведет к операции 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();
}
Это идеальное использование регулярных выражений. Ознакомьтесь с этим полезным веб-сайтом, классом регулярных выражений .Net и этой очень полезной книгой по освоению регулярных выражений .