Замена в строке макросов на данные - C#

Узнай цену своей работы

Формулировка задачи:

Цель

- Полученную от пользователя строку такого рода: "ерунда %data %N %Type Еще малясь ерунды" преобразовать в новую строку "ерунда 11.2976 17 int Еще малясь ерунды" Т.Е. нужно заменить макросы на данные. Как лучше это организовать? Вид самих макросов не обязательно должен быть таким. Суть в том чтоб пользователь смог их вводить в ручную (они должны быть короткими), но пользователь мог понять на что они будут изменены еще до замены. Всего макросов будет 20-30 1) Искать совпадения с каждым из этих 30 в этой строке, а затем заменять. Т.Е. Пропускать 30 разных циклов. 2) Искать общий символ, тот же % скажем. А уже затем выяснять что это за макрос. (Длина скорее всего будет разная) Есть ли способы лучше? (Быстрее) В каком виде хранить список этих макросов? Изначально половина данных уже хранится в памяти (для подстановки) лежит это все дело в структуре. Мне бы не хотелось нагружать эту структуру всеми 30. Лично я себе представляю 2 for'a вложенных в друг друга в первом будет проходить по массиву string[] с этими макросами получая искомый в данный момент макрос, а так же подбор через swich варианта замены для него. Во втором Цикле поиск совпадения замена его, и поиск повторно. (Для избежания ошибок при 2 и более одинаковых макросах) Однако такой код будет громоздкий, да и не быстрый. (Даже если проверить на наличие этих % перед циклом)

Решение задачи: «Замена в строке макросов на данные»

textual
Листинг программы
  1. int Counter = 0;
  2. var Macro = new Dictionary<string, Func<object>>()
  3. {
  4.     { "counter", () => Counter++ },
  5.     { "date",    () => DateTime.Now },
  6.     { "const_a", () => "A" }
  7. };
  8.  
  9. string Text = "Counters: %COUNTER %COUNTER Percent: %% Date: %DATE Const: %CONST_A";
  10. Text = Regex.Replace(Text, @"%(?<m>(\w|_)+|%)",
  11.     (m) =>
  12.     {
  13.         string name = m.Groups["m"].Value.ToLower();
  14.         if (name == "%") return "%";
  15.         if (!Macro.ContainsKey(name))
  16.             throw new Exception("Макрос <" + name + "> не найден");
  17.         return Macro[name]().ToString();
  18.     });
  19.  
  20. Console.WriteLine(Text);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы