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

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

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

Цель

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

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

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

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


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

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

12   голосов , оценка 4.5 из 5
Похожие ответы