【问题标题】:Lua 'plain' string.gsubLua '普通' string.gsub
【发布时间】:2009-11-16 23:06:32
【问题描述】:

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

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

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

对于使用 lineBlineA 到换行的任何帮助将不胜感激。

【问题讨论】:

    标签: string parsing lua gsub lua-patterns


    【解决方案1】:

    摘自《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

    【讨论】:

    • 另一种(可能更快)写字面化的方法:str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%0")
    • 优秀的方法。旁注:是的,lua 模式在很多时候都是障碍。 '强大的'。有用吗?
    【解决方案2】:

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

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

    【讨论】:

    • 只要把它放在一个循环中,直到 find 返回非 nil 以匹配 gsub 替换所有出现的模式。
    • 这也不起作用,因为在 string.find 中,魔术字符也被认为是这样的(请参阅下面的下一个答案)。
    • 传递 true 作为第四个参数(self、pattern、init、plain)使函数忽略模式中的魔法字符。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-15
      • 2015-05-18
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多