3

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

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' 标志来取消模式搜索的选项。

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

任何帮助从lineA换行使用lineB将不胜感激。

4

3 回答 3

8

取自《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.

于 2009-11-17T03:53:48.880 回答
4

您可以使用另一种方法,例如:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
于 2009-11-16T23:25:41.350 回答
2

您还可以使用以下方法对文本字符串 str 中的标点符号进行转义:

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

于 2012-11-19T13:25:43.083 回答