views:

166

answers:

2

Hi,

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 tp get from lineA to newline using lineB would be most appreciated .

Regards

John

+3  A: 

You may use another approach like:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
Kknd
Just put that in a loop until find returns non-nil to match that gsub replaces all occurrences of the pattern.
sbk
This doesn't work either, because also in string.find magic characters are considered as such (see next answer below).
Gert
+3  A: 

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.

Mark Rushakoff