Lua string.find()错误

时间:2017-03-16 20:47:23

标签: lua

所以我正在写一个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" \n\r的更改是因为它实际上应该是这样的。

1 个答案:

答案 0 :(得分:2)

此错误是因为string.find使用Lua Patterns

大多数非字母数字字符,例如"[", ".", "-"等,都会传达特殊含义。

string.find(fc,weird)或更好,fc:find(weird)正在尝试解析这些特殊字符并出错。

但是,您可以使用这些模式取消其他模式。

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

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

("--[[")是你怪异字符串的首位部分,按预期工作。

:gsub()是一个用另一个替换模式的函数。再次,请参阅Patterns

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

%%%0替换与自身匹配的所有内容(%0是表示此匹配中所有内容的字符串),跟随%进行转义。

因此,这意味着[[将变为%[%[,这就是查找和类似模式“逃避”特殊字符的方式。

\n现在\r?\n的原因是指这些模式。如果它以\n结尾,则匹配它,就像之前一样。但是,如果它在Windows上运行,则换行符可能看起来像\r\n。 (你可以阅读这个HERE)。在这种情况下,?跟随字符\r,意味着可选匹配它。所以这匹配--[[\n --[[\r\n,支持windows和linux。

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

希望这有帮助!

如果你有点懒惰

完成的代码
weird = ("--[["):gsub("%W","%%%0") .. "\r?\n" // Escape "--[[", add a newline. Used in our find.

// readAll(file)
// Takes a string as input representing a filename, returns the entire contents as a string.
function readAll(file)
    local c = io.open(file, "rb")   // Open the file specified by the argument. Read-only, binary (Doesn't autoformat things like \r\n)
    local j = c:read("*all")        // Dump the contents of the file into a string.
    c:close()                       // Close the file, free up memory.
    return j                        // Return the contents of the string.
end

// blockActive()
// returns whether or not the weird string was matched in 'functions.lua', executes 'blockDeactivated.lua' if it wasn't.
function blockActive()
    local fc = readAll("functions.lua") // Dump the contents of 'functions.lua' into a string.
    if fc:find(weird) then              // If it functions.lua has the block-er.
        require("blockDeactivated")     // Require (Thus, execute, consider loadfile instead) 'blockDeactived.lua'
        return false                    // Return false.
    else
        return true                     // Return true.
    end
end
print(blockActive()) // Test? the blockActve code.