Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lua string.gsub with a hyphen

I have two strings - each string has many lines like the following:

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

Result:

data = "HOSTNAME = DEFAULT-VLAN"

When the hyphen ("-") is deleted from the value it is working. Is there an easy way to solve this?

Thanks!

like image 973
Zizanzu Avatar asked Mar 16 '15 08:03

Zizanzu


2 Answers

- is a magic character in Lua patterns. You need to escape it.

Change

value_1 = "DEFAULT-VLAN"

to:

value_1 = "DEFAULT%-VLAN"
like image 60
Yu Hao Avatar answered Sep 21 '22 02:09

Yu Hao


This is because string.gsub takes a pattern similar to Regex—it does not do a "literal" replacement; this means you need to prefix any characters that have a special meaning with % to escape them.

A list of special characters that need escaping for the pattern are: (, ), ., +, -, *, ?, [, ], ^, $, and %. For the replacement string, only % has a special meaning. With this, we can write a replace function that sanitizes the inputs.

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

And then you can:

result = replace(data, value_1, value_2)
like image 42
Ashleigh Avatar answered Sep 22 '22 02:09

Ashleigh