Lua string.gsub с дефисом

У меня есть две строки - каждая строка имеет много строк, например:

value_1 = "DEFAULT-VLAN"
value_2 = "WAN"
data = "HOSTNAME = DEFAULT-VLAN"
result = string.gsub(data,value_1,value_2)
print(result)

Результат:

data = "HOSTNAME = DEFAULT-VLAN"

Когда дефис («-») удаляется из значения, оно работает. Есть ли простой способ решить эту проблему?

Спасибо!


person Zizanzu    schedule 16.03.2015    source источник


Ответы (2)


- — магический символ в шаблонах Lua. Вам нужно убежать от него.

Изменять

value_1 = "DEFAULT-VLAN"

to:

value_1 = "DEFAULT%-VLAN"
person Yu Hao    schedule 16.03.2015
comment
Почему я получаю nil за это? string.find("evs%-admin%-loggedstatistics%.csv", "evs%-admin%-loggedstatistics%.csv") - person iamsmkr; 04.07.2018
comment
@codingkapoor Волшебные символы здесь предназначены для шаблонов, а не буквальных строк. Удалите все % в первом аргументе string.find. - person Yu Hao; 04.07.2018

Это связано с тем, что string.gsub использует шаблон, аналогичный регулярному выражению, — он не выполняет «буквальную» замену; это означает, что вам нужно ставить перед любыми символами, имеющими особое значение, префикс %, чтобы избежать их.

Список специальных символов, которые необходимо экранировать для шаблона: (, ), ., +, -, *, ?, [, ], ^, $ и %. Для строки замены только % имеет особое значение. С этим мы можем написать функцию замены, которая дезинфицирует входные данные.

local function replace(str, what, with)
    what = string.gsub(what, "[%(%)%.%+%-%*%?%[%]%^%$%%]", "%%%1") -- escape pattern
    with = string.gsub(with, "[%%]", "%%%%") -- escape replacement
    return string.gsub(str, what, with)
end

И тогда вы можете:

result = replace(data, value_1, value_2)
person Ashleigh    schedule 31.03.2015