Lua: Делать быстрые множественные замены в длинных строках - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть

  • Список пар шаблон / замена.
  • Длинная строка для замены (несколько килобайт или даже мегабайт).

Все вхождения всех шаблонов должны быть заменены соответствующими текстами замены.Каждый шаблон может существовать в строке более одного раза.

В настоящее время я делаю это, перебирая список пар шаблон / замена и используя string.gsub каждый раз:

for _, pattern, replace in iter(replace_patterns) do
  body = body:gsub(pattern, replace)
end

(iter - это вспомогательная функция для лучшей итерации по шаблонам.)

Вопрос: Это лучший способ сделать это?Я боюсь, что это будет неэффективно, так как каждый вызов gsub будет сканировать всю длинную строку.

PS Я прочитал https://stackoverflow.com/a/12865406/5005936 (помог мне сократить использование строки и другие) и https://stackoverflow.com/a/38422229/5005936 (но я не хочу писать нативный код в этом контексте ...)

1 Ответ

0 голосов
/ 16 ноября 2018

Пара вещей, которые вы, возможно, захотите попробовать (вам нужно запустить несколько тестов для своих строк, чтобы увидеть, что работает лучше всего):

  1. Используйте find вместо gsub какзанимает начальную позицию, что позволяет избежать повторного сканирования одной и той же (длинной) строки для каждого шаблона
  2. Используйте table.concat для объединения конечных строк вместе;по существу, используйте find, чтобы получить позиции, где начинаются замены, и обрезать (под) строки, чтобы заполнить таблицу заменами и строки между ними.Затем объедините результаты вместе, чтобы получить нужную вам строку.

Вам придется запускать тесты, поскольку сложно дать разумный совет, не зная количества шаблонов и приблизительного количества замен.для каждого шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...