В моем файле настроек приложения каждая строка принимает форму name = value (пример: color = red). Имена определяются приложением, тогда как значения - это текст, набранный пользователем.
Поскольку для формата файла требуется один параметр для каждой строки, возникает проблема, если значение пользователя содержит разрыв строки ("\n", ASCII 10): это приведет к сбою анализатора (или позволит им вставлять поддельные имена = значения с недопустимыми именами). Тем не менее, я хочу, чтобы пользователь мог использовать этот символ, поэтому мне нужно как-то избежать его: например, s = s.Replace("\n", "\\n");
Однако пользователь может также ввести двухсимвольную последовательность "\" + "n". Поэтому предположим, что у меня есть любая произвольная неприятная строка, такая как "ABC\n\\n \\\\n\n \\\nXYZ" (которая имеет два разрыва строки и две буквальные "\" + "n" последовательности в ней). Какой алгоритм будет безопасно (i) избежать строки, чтобы убедиться, что она не содержит новых строк, а затем (ii) отменить процесс восстановления исходной строки?
если вы хотите обрабатывать '\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
ParseBack
глотает автономную обратную косую черту.
Во-первых, вы можете использовать @"string"
, которая остановит escape-последовательность
Итак, в основном, @"\n"
получится как \n
а не как новая строка
Чтобы ваша строка нарушала значение пользователя, у меня тоже была эта проблема, и мне удалось ее заменить, заменив newline-char (\n
) тем, что пользователь никогда не будет вводить (например, <|NewLine|>
). Когда я пишу или читаю из файла, я заменяю соответствующие значения
Чтобы заменить символ newline-char чем-то другим, это не лучшее решение, но я люблю его использовать, потому что он довольно прост для меня
The names are determined by the app, whereas the values are text typed by the user.