Lua中的 'plain' string.gsub指的是在字符串中进行模式匹配并替换的函数。它使用简单的模式匹配规则,可以直接匹配原始字符串中的字符,与正则表达式不同。

我在字符串解析中遇到了小问题。我有一个字符串:

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

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

任何帮助让我从 lineAnewline,并使用 lineB,都将不胜感激。

原文链接 https://stackoverflow.com/questions/1745448

点赞
stackoverflow用户18403
stackoverflow用户18403

你可以使用另一种方法,比如:

local i1, i2 = lineA:find(lineB, nil, true)
local result = lineA:sub(i2 + 1)
2009-11-16 23:25:41
stackoverflow用户126042
stackoverflow用户126042

从《Programming in 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-17 03:53:48
stackoverflow用户282843
stackoverflow用户282843

你也可以在文本字符串str中转义标点符号,方法是使用:

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

2012-11-19 13:25:43