4

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.

3 Answers 3

8

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Another (probably faster) way to write literalize: str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%0")
EXCELLENT approach. Side note: yeah lua patterns are in the way a lot of the time. 'Powerful'. How about useful?
4

You may use another approach like:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)

3 Comments

Just put that in a loop until find returns non-nil to match that gsub replaces all occurrences of the pattern.
This doesn't work either, because also in string.find magic characters are considered as such (see next answer below).
Passing true as the forth parameter (self, pattern, init, plain) makes the function ignore magic characters in the pattern.
2

You can also escape punctuation in a text string, str, using:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.