Выход из новой строки при наличии буквального «\» + «n»

2

В моем файле настроек приложения каждая строка принимает форму name = value (пример: color = red). Имена определяются приложением, тогда как значения - это текст, набранный пользователем.

Поскольку для формата файла требуется один параметр для каждой строки, возникает проблема, если значение пользователя содержит разрыв строки ("\n", ASCII 10): это приведет к сбою анализатора (или позволит им вставлять поддельные имена = значения с недопустимыми именами). Тем не менее, я хочу, чтобы пользователь мог использовать этот символ, поэтому мне нужно как-то избежать его: например, s = s.Replace("\n", "\\n");

Однако пользователь может также ввести двухсимвольную последовательность "\" + "n". Поэтому предположим, что у меня есть любая произвольная неприятная строка, такая как "ABC\n\\n \\\\n\n \\\nXYZ" (которая имеет два разрыва строки и две буквальные "\" + "n" последовательности в ней). Какой алгоритм будет безопасно (i) избежать строки, чтобы убедиться, что она не содержит новых строк, а затем (ii) отменить процесс восстановления исходной строки?

  • 8
    Рассматривали ли вы возможность написания собственного парсера для этой работы и предпочитаете использовать «установленный» парсер и формат файла, такой как json или XML?
  • 0
    Чтобы разобрать, что вам нужно пройти через каждый символ, и когда вы видите `\`, вы устанавливаете флаг, что следующий символ экранирован, а затем соответственно обрабатываете этот следующий символ и снимаете флажок. Но гораздо лучше найти парсер, который справится с этим вместо вас.
Показать ещё 4 комментария
Теги:
escaping
newline

2 ответа

1
Лучший ответ

если вы хотите обрабатывать '\n', будут работать следующие методы:

string Parse(string input)
{
    return input.Replace("\\","\\\\").Replace("\n","\\n");
}

string ParseBack(string input)
{
    string output="";
    for(int i=0; i < input.Length; i++)
    {
        if(input[i]=='\\')
        {
            i++;
            if(input[i]=='n')
            {
                output += '\n';
            }
            else 
            {
                output += input[i];
            }
        }
        else
        {
            output += input[i];
        }
    }
    return output;
}

Входные данные:

ABC 
\n\\n 
\ 
XYZ

Успешно разобран:

ABC\n\\n\\\\n\n\\\nXYZ

ParsedBack:

ABC 
\n\\n 
\ 
XYZ
  • 0
    ParseBack глотает автономную обратную косую черту.
  • 0
    @ 500-InternalServerError автономная обратная косая черта будет проанализирована как двойная обратная косая черта, которая будет проанализирована как отдельная обратная косая черта.
Показать ещё 1 комментарий
-2

Во-первых, вы можете использовать @"string", которая остановит escape-последовательность

Итак, в основном, @"\n" получится как \n а не как новая строка

Чтобы ваша строка нарушала значение пользователя, у меня тоже была эта проблема, и мне удалось ее заменить, заменив newline-char (\n) тем, что пользователь никогда не будет вводить (например, <|NewLine|>). Когда я пишу или читаю из файла, я заменяю соответствующие значения

Чтобы заменить символ newline-char чем-то другим, это не лучшее решение, но я люблю его использовать, потому что он довольно прост для меня

  • 1
    Строка OP, вероятно, не выходит из литералов времени компиляции.
  • 1
    @ 500-InternalServerError 100% не являются литералами времени компиляции, поскольку OP сказал, что The names are determined by the app, whereas the values are text typed by the user.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню