Lua string.find() 错误

所以我正在编写一个 Lua 脚本并测试它,但我遇到一个错误,我不知道如何修复:

.\search.lua:10: malformed pattern (missing ']')

以下是我的代码。如果您知道我做错了什么,如果您能告诉我,那将非常有帮助。

weird = "--[[".."\n"
function readAll(file)
    local c = io.open(file, "rb")
    local j = c:read("*all")
    c:close()
    return(j)
end
function blockActive()
    local fc = readAll("functions.lua")
    if string.find(fc,weird) ~= nil then
        require("blockDeactivated")
        return("false")
    else
        return("true")
    end
end
print(blockActive())

编辑:第一条评论给出了答案。我将 weird = "--[[".."\n" 更改为 weird = "%-%-%[%[".."\r" 因为本来就应该是 \r,而不是 \n

点赞
用户7170955
用户7170955

这里的错误是因为 string.find 使用了 Lua 模式。大多数非字母数字字符,如 "[", ".", "-" 等,都有特殊含义。string.find(fc,weird) 或更好的 fc:find(weird) 尝试解析这些特殊字符,从而导致错误。

但是你可以使用这些模式来取消其他模式,例如:

weird = ("--[["):gsub("%W","%%%0") .. "\r?\n"

这可能有点令人生畏,但希望它有意义。

("--[[") 是你的奇怪字符串的原始第一部分,按预期工作。

:gsub() 是一个函数,它将模式替换为另一个模式。再次查看 模式

"%W" 是一种模式,匹配不是字母、数字或下划线的每个字符串。

%%%0 将与本身匹配的所有内容替换为它本身(%0 是代表该匹配中的所有内容的字符串),后跟一个转义的 %

这意味着 [[ 将变成 %[%[,这就是 find 和类似的模式“转义”特殊字符的方式。

现在,\n 变成了 \r?\n,这回到了这些模式。如果以 \n 结尾,它将匹配它,就像以前一样。但是,如果在 Windows 上运行,换行可能会看起来像 \r\n。(你可以在这里阅读更多信息。)在一个字符后面的 ?,在这种情况下,是 \r,它表示它可以以任意方式匹配它。因此,这将匹配 --[[\n--[[\r\n,支持 Windows 和 Linux。

现在,当你运行 fc:find(weird) 时,它运行的是 fc:find("%-%-%[%[\r?\n"),这应该是你想要的。

希望这可以帮到你!

如果你有点懒的话,这是代码:

weird = ("--[["):gsub("%W","%%%0") .. "\r?\n" // 转义 "--[[",并添加一个换行符。用于我们的查找。

// readAll(file)
// 以字符串作为输入,表示文件名,返回整个内容作为字符串。
function readAll(file)
    local c = io.open(file, "rb")   // 打开一个由参数指定的文件。只读、二进制(不会自动格式化像 \r\n 这样的东西)
    local j = c:read("*all")        // 将文件的内容转储到字符串中。
    c:close()                       // 关闭文件,释放内存。
    return j                        // 返回字符串的内容。
end

// blockActive()
// 如果在 'functions.lua' 中匹配到奇怪的字符串,则返回 true,否则执行 'blockDeactivated.lua'function blockActive()
    local fc = readAll("functions.lua") // 将 'functions.lua' 的内容转储到字符串中。
    if fc:find(weird) then              // 如果 functions.lua 有阻塞程序。
        require("blockDeactivated")     // 需要(因此执行,考虑使用 loadfile'blockDeactived.lua'return false                    // 返回 falseelse
        return true                     // 返回 trueend
end
print(blockActive()) // 测试一下 blockActve 代码。
2017-03-30 04:00:30