Lua'plain'tring.gsub

时间:2009-11-16 23:06:32

标签: string parsing lua gsub lua-patterns

我用字符串解析打了一个小块。我有一个字符串:

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

我在使用gsub删除字符串的一部分时遇到了困难。通常我会这样做

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

通常会给我'cars_ [100] _upper.exr'

问题是gsub不喜欢字符串中的[]或其他特殊字符,而且与string.find不同,gsub没有使用'plain'标志取消模式搜索的选项。

我无法手动编辑行以包含特殊字符的转义字符,因为我正在执行文件比较脚本。

非常感谢使用lineAlineB到换行符的任何帮助。

3 个答案:

答案 0 :(得分:7)

摘自Lua 2e编程的第181页:

  

神奇的角色是:

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

字符'%'用作转义符   对于这些神奇的角色。

所以,我们可以想出一个简单的函数来逃避这些神奇的角色,并将它应用到你的输入字符串(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)

当然会打印:cars_[100]_upper.exr

答案 1 :(得分:4)

您可以使用其他方法,例如:

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

答案 2 :(得分:2)

您还可以使用:

在文本字符串str中转义标点符号

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