C# - Автоматическое определение фигурных скобок Escape и Argument в строке. Формат - PullRequest
1 голос
/ 23 января 2020

начиная с этого C# примера:

string myStringFormat = "I want to surround string {0} with {{ and }}";
string myStringArgs = "StringToSurround";
string myFinalString = string.Format(myStringFormat, myStringArgs);

Я хотел бы знать, существует ли быстрый и простой способ различения guish между escape-символом / последовательностью и аргументами для фигурные скобки.

Причины, по которым я спрашиваю это:
+] Я хочу предоставить некоторые функции ведения журналов и не хочу, чтобы пользователи знали о правилах двойных фигурных скобок / скобок
+] Я хочу очень быстро выполнить это различие для требований к производительности

В настоящее время единственное решение, о котором я могу подумать, - это сканирование строки в поисках фигурных скобок / скобок и некоторая проверка (анализ числа) на последующие персонажи. Возможно, регулярное выражение может быть полезным, но я не могу найти способ использовать их в этом сценарии.

Кстати, последняя ситуация, которую я хотел бы достичь, - это разрешить пользователю без исключений:

string myStringFormat = "I want to surround string {0} with { and }";
string myStringArgs = "StringToSurround";
//string myFinalString = string.Format(myStringFormat, myStringArgs); throwing exception
string myFinalString = MyCustomizedStringFormat(myStringFormat, myStringArgs);

РЕДАКТИРОВАТЬ:

извините, слово "round "было хитрым и вводящим в заблуждение, пожалуйста, рассмотрите этот пример:

string myStringFormat = "I want to append to string {0} these characters {{ and }}";
string myStringArgs = "StringToAppendTo";
string myFinalString = string.Format(myStringFormat, myStringArgs);

, дающий вывод
Я хочу добавить в строку StringToAppendTo эти символы {и}

1 Ответ

1 голос
/ 23 января 2020

Используйте это регулярное выражение, чтобы найти подстроки аргумента:

{\d+}

Это регулярное выражение экранирует {} {1a} и c. и только выбирает {1} {11} et c.


Теперь вам нужно обрабатывать либо Аргументы (заменить их значениями), либо Escape-фигурные скобки (заменить их на двойные брекеты). Выбор за вами, и это зависит от количества случаев в каждом конкретном случае. (Я решил заменить аргументы в моем коде ниже)

Теперь вам нужно заменить символы. Опять же, ваш выбор - использовать StringBuilder или нет. Это зависит от размера вашего ввода и количества замен. В любом случае я предлагаю StringBuilder.

var m = Regex.Matches(input, @"{\d+}");
if (m.Any())
{
    // before any arg
    var sb = new StringBuilder(input.Substring(0, m[0].Index));

    for (int i = 0; i < m.Count; i++)
    {
        // arg itself
        sb.Append(args[i]);

        // from right after arg 
        int start = m[i].Index + m[i].Value.Length;

        if (i < m.Count - 1)
        {
            // until next arg
            int length = m[i + 1].Index - start;
            sb.Append(input.Substring(start, length));
        }
        else
            // until end of input
            sb.Append(input.Substring(start));
    }
}

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


Редактировать

Если у вас нет доступа к args[], вы можете сначала заменить { / } на {{ / }}, а затем просто выполнить эти изменения для код:

  1. используйте этот шаблон: @"{{\d+}}"
  2. напишите m[i].Value.Substring(1, m[i].Value.Length - 2) вместо args[i]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...