Мое первое предложение состоит в том, чтобы измерить производительность самого простого способа сделать это (который, вероятно, является множественными вызовами замены / замены всех). Да, это потенциально неэффективно. Довольно часто самый простой способ сделать это неэффективен. Вы должны спросить себя: сколько вы заботитесь?
Есть ли у вас образцы данных и порог, при котором производительность приемлема? Если нет, то это первый порт захода. Затем протестируйте наивную реализацию и посмотрите, действительно ли это является проблемой. (Имейте в виду, что замена строк почти наверняка является только частью того, что вы делаете. Когда вы выбираете текст из базы данных для начала, это может хорошо закончиться являясь узким местом.)
Как только вы определили, что замена действительно является узким местом, стоит выполнить несколько тестов, чтобы увидеть, какие биты замены вызывают самую большую проблему - похоже, вы делаете несколько разных видов замены. Чем больше вы можете сузить его, тем лучше: вы можете обнаружить, что реальное узкое место в простейшем коде вызвано чем-то, что легко сделать эффективным разумно простым способом, тогда как попытка оптимизировать все будет намного сложнее.