Lua 'обычный' string.gsub - PullRequest
       16

Lua 'обычный' string.gsub

3 голосов
/ 17 ноября 2009

Я ударил маленький блок с разбора строки. У меня есть строка вроде:

footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr

и мне трудно использовать gsub для удаления части строки. Обычно я бы сделал это

lineA = footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr
lineB = footage/down/temp/cars_[100]_upper/
newline = lineA:gsub(lineB, "")

, что обычно дает мне 'cars_ [100] _upper.exr'

Проблема в том, что gsub не нравится [] или другие специальные символы в строке и в отличие от string.find gsub не имеет возможности использовать флаг 'plain' для отмены поиска по шаблону.

Я не могу вручную редактировать строки, чтобы включить escape-символы для специальных символов, так как я делаю файл сценария сравнения файлов.

Любая помощь по переходу с lineA на новую строку с использованием lineB будет наиболее ценной.

Ответы [ 3 ]

8 голосов
/ 17 ноября 2009

Взяв со страницы 181 Программирование в Lua 2e:

Магические персонажи:

( ) . % + - * ? [ ] ^ $

Персонаж '%' работает как побег для этих магических персонажей.

Итак, мы можем просто придумать простую функцию для экранирования этих магических символов и применить ее к вашей входной строке (lineB):

function literalize(str)
    return str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
end

lineA = "footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr"

lineB = literalize("footage/down/temp/cars_[100]_upper/")

newline = lineA:gsub(lineB, "")

print(newline)

Что, конечно, печатает: cars_[100]_upper.exr.

4 голосов
/ 17 ноября 2009

Вы можете использовать другой подход, например:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
2 голосов
/ 19 ноября 2012

Вы также можете избежать пунктуации в текстовой строке str, используя:

str:gsub ("%p", "%%%0")

...