Я пытаюсь написать две функции escape(текст, разделитель)
и unescape(текст, разделитель)
со следующими свойствами:
Результат escape
не содержит разделитель
.
unescape
является обратным escape
, то есть
unescape(escape(текст, разделитель), разделитель) == текст
для всех значений текст
и разделитель
Можно ограничить допустимые значения разделитель
.
Фон: я хочу создать строку значений, разделенных разделителями. Чтобы иметь возможность снова извлечь тот же список из строки, я должен убедиться, что отдельные разделенные строки не содержат разделителя.
Что я пробовал: я придумал простое решение (псевдокод):
escape(text, delimiter): return text.Replace("\", "\\").Replace(delimiter, "\d")
unescape(text, delimiter): return text.Replace("\d", delimiter).Replace("\\", "\")
, но обнаружил, что свойство 2 не работает в тестовой строке "\d
. В настоящее время у меня есть следующее рабочее решение
escape(text, delimiter): return text.Replace("\", "\b").Replace(delimiter, "\d")
unescape(text, delimiter): return text.Replace("\d", delimiter).Replace("\b", "\")
, которое, похоже, работает, если delimiter
не равно \
, b
или d
(это нормально, я все равно не хочу использовать их в качестве разделителей). Однако, поскольку формально я не доказал его правильность, боюсь, что упустил какой-то случай, когда одно из свойств нарушается. Поскольку это такая распространенная проблема, я предполагаю, что для этого уже существует «хорошо известный проверенный правильный» алгоритм, отсюда и мой вопрос (см. заголовок).