Я заметил, что прошло уже год, так как это было активно, но для чего это стоит. I came across an article on CodeProject сегодня, который претендует на решение этой проблемы - возможно, вы можете использовать идеи оттуда:
Я не могу ручаться за его правильность, но, возможно, стоит взглянуть на нее.:)
Реализация, конечно же, требует хранения всей строки в памяти, но вы можете легко обойти это (как и с любой другой реализацией, которая выполняет замены), если вы можете разделить вход на блоки и гарантировать, что вы никогда не разбивается на позицию, которая находится внутри символ, подлежащий замене. (Один простой способ сделать это в вашем случае, чтобы разбить в положении, где на следующий символ не является какой-либо из символов, используемых в символе.)
-
Существует причина, за производительность (хотя это достаточная причина в моей книге) добавить метод «ReplaceMultiple» в свою библиотеку строк: просто выполнение операции замены N раз НЕ является правильным вообще.
Если значения, которые замещены для символов не ограничены, значения может в конечном итоге рассматриваться как символов в последующих операциях замены. (Там могут быть ситуации, когда вы на самом деле хотите, но есть определенные случаи, когда вы этого не делаете. Использование странных символов уменьшает серьезность проблемы, но не решает ее, а «уродливо», потому что строки, которые нужно отформатировать, могут определяться пользователем - и поэтому не должны содержать экзотических символов.)
Однако, я подозреваю, что есть веская причина, по которой я не могу легко найти общую реализацию с несколькими заменами. Операция «ReplaceMultiple» просто не является (очевидно) четко определенной в целом.
Чтобы увидеть это, рассмотрите, что он может сделать означает, чтобы заменить «aa» на «!» и 'baa' с '?' в строке «abaa»? Является результатом «ab!» или 'a?' - или такая замена незаконна?
Возможно, символы должны быть «префиксными», но во многих случаях это было бы неприемлемо. Скажем, я хочу использовать это для форматирования текста шаблона. И скажите, что мой шаблон предназначен для кода. Я хочу заменить «§ table» именем таблицы базы данных, известным только во время выполнения. Было бы обидно, если бы я теперь не мог использовать «§t» в том же шаблоне. Шаблонный скрипт может быть чем-то совершенно общим, и в одно мгновение я сталкиваюсь с клиентом, который фактически использовал «§» в своих именах таблиц ... потенциально делая мою библиотеку шаблонов более менее полезной.
Возможно, лучшим решением было бы использовать парсер рекурсивного спуска вместо простой замены литералов. :)
Откуда взялась строка? – JoshD
Как мы знаем, 'O (n) + O (n)' все еще 'O (n)', в чем тут мотивация * real *? – Arun
Фактическая строка/данные потенциально составляет 100 с гигабайт в размере, обрабатывается поэтапно, а при вызове замены дважды все еще O (n), n довольно большой. –