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