English 中文(简体)
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.

问题回答

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.

You may use another approach like:

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

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

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





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签