Выход из новой строки при наличии буквальных символов "\" + "n" - PullRequest
0 голосов
/ 03 октября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

, если вы хотите обрабатывать только '\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

Parsed:

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

ParsedBack:

ABC 
\n\\n 
\ 
XYZ
0 голосов
/ 03 октября 2018

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

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

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

Заменить символ новой строки на что-то другое - не лучшее решение, но мне нравится его использовать, потому что для меня это довольно просто

...