Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lua 'plain' string.gsub

I've hit s small block with string parsing. I have a string like:

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

and I'm having difficulty using gsub to delete a portion of the string. Normally I would do this

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

which would normally give me 'cars_[100]_upper.exr'

The problem is that gsub doesn't like the [] or other special characters in the string and unlike string.find gsub doesn't have the option of using the 'plain' flag to cancel pattern searching.

I am not able to manually edit the lines to include escape characters for the special characters as I'm doing file a file comparison script.

Any help to get from lineA to newline using lineB would be most appreciated.

like image 942
user212458 Avatar asked Sep 18 '25 23:09

user212458


2 Answers

Taking from page 181 of Programming in Lua 2e:

The magic characters are:

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

The character '%' works as an escape for these magic characters.

So, we can just come up with a simple function to escape these magic characters, and apply it to your input string (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)

Which of course prints: cars_[100]_upper.exr.

like image 101
Mark Rushakoff Avatar answered Sep 22 '25 06:09

Mark Rushakoff


You may use another approach like:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
like image 40
Kknd Avatar answered Sep 22 '25 06:09

Kknd