John Doe wrote: ↑Wed 29 Nov, 2017 08:18
IgorZ wrote: ↑Wed 29 Nov, 2017 05:44Навскидку, mf.replace нельзя заменить на string.gsub в тех случаях, когда надо выполнять замену (такая вот тавтология), игнорируя возможные регулярные выражения в образце
gsub можно переписать, используя find.
А у find есть параметр plain.
Или ещё проще, можно экранировать "опасные" символы.
Можно, я прикидывал, когда писал. Цикл, в цикле find, два sub, сращиваем, запоминаем, запоминаем позицию, чтоб на следующей итерации искать после заменённого... Сколько кода это займёт? Да и по времени навскидку один шаг итерации будет выполняться в разы дольше, чем весь replace. В итоге сказал "Нафиг, нафиг..." и использовал mf.replace. Быстро и удобно.
С экранированием тоже весело. Поскольку образец для замены заранее неизвестен, это надо делать динамически перед заменой. Поскольку мы заменяем спецсимволы, то это тоже придётся делать, перебирая строку образца в цикле. В общем, если и быстрее, чем через find, то ненамного. Хотя нет. Тут можно обойтись и конструкцией типа
pattern:gsub("[%.%[%]%(%)%%]","%%%0")
. Уже лучше, но тоже далеко не айс.
В общем, вердикт такой. Можно самому написать замену для чего угодно. Для строк, в частности, достаточно sub, остальное пишется вручную. Но зачем, если уже есть хороший, удобный инструмент?
P. S. Во если бы все строковые функкции Lua имели параметр plain, а не только find... Но даже если это появится в новой версии, далеко не факт, что эта новая версия будет встроена в Far.