Я заметил, что прошел год с тех пор, как он был активным, но для чего это стоит. Сегодня я наткнулся на статью о CodeProject , в которой утверждается, что она решает эту проблему - может быть, вы можете использовать идеи оттуда:
Я не могу ручаться за его правильность, но, возможно, стоит взглянуть. :)
Реализация, безусловно, требует хранения всей строки в памяти, но вы можете легко обойти это (как и в любой другой реализации, которая выполняет замены), если вы можете разделить входные данные на блоки и гарантировать, что вы никогда не разделите на позиция внутри символа, подлежащего замене. (Один из простых способов сделать это в вашем случае - разделить в позиции, где следующий символ не является каким-либо из символов, используемых в символе.)
-
Существует причина не по производительности (хотя в моей книге это достаточная причина) для добавления метода ReplaceMultiple в библиотеку строк: простое выполнение операции замены N раз НЕ является правильным в общем.
Если значения, заменяющие символы, не ограничены, значения могут в конечном итоге рассматриваться как символы в последующих операциях замены. (Могут быть ситуации, когда вы на самом деле захотите этого, но определенно есть случаи, когда вы этого не делаете. Использование странно выглядящих символов уменьшает серьезность проблемы, но не решает ее, и «некрасиво», потому что строки, которые должны быть отформатированы, могут быть определены пользователем - и поэтому не должны требовать экзотических символов.)
Однако я подозреваю, что есть веская причина, по которой я не могу легко найти общую реализацию с несколькими заменами. Операция «ReplaceMultiple» просто (очевидно) не является четко определенной в целом.
Чтобы увидеть это, подумайте, что может означать , чтобы заменить 'aa' на '!' и 'baa' с '?' в строке «абааа»? Является ли результат "ab!" или "а?" - или такая замена незаконна?
Можно потребовать, чтобы символы были «без префиксов», но во многих случаях это было бы неприемлемо. Скажем, я хочу использовать это для форматирования текста шаблона. И скажи, что мой шаблон для кода. Я хочу заменить «§table» именем таблицы базы данных, известным только во время выполнения. Было бы неприятно, если бы я теперь не мог использовать «§t» в том же шаблоне. Шаблонный сценарий может быть чем-то совершенно общим, и вот, однажды, я столкнулся с клиентом, который фактически использовал «§» в именах своих таблиц ... потенциально делая мою библиотеку шаблонов довольно менее полезной.
Возможно, лучшим решением было бы использование синтаксического анализатора с рекурсивным спуском вместо простой замены литералов. :)