问题描述
local code = [[
client_script 'Bait.lua'
client_script 'Test.lua' --Test
]]
我将如何制作一个包含 client_script '
和 ' --Test
之间的所有内容的正则表达式/模式
解决方法
code
似乎是 Lua 代码,因此如果使用等效但不同的代码段("
而不是 '
,括号,行),任何基于模式的解决方案都将失败中断、多行注释等)。为什么不把它解析为 Lua?
local code = [[
client_script 'Bait.lua'
client_script 'Test.lua' --Test
]]
local scripts = {}
local newenv = {
client_script = function(name)
table.insert(scripts,name)
end
}
load("local _ENV=...;"..code)(newenv)
for i,v in ipairs(scripts) do
print(v)
end
这会解析并加载代码,但使用 newenv
作为环境,并使用不同的 client_script
定义来存储值。请注意,FiveM 还使用了 client_scripts
和一些其他必须存在的函数(但其中大部分可以简单地指定为 function()end
)。
此外,上述代码仅适用于 Lua 5.2 及更高版本。 Lua 5.1 的不同之处在于带有 load
的那一行,必须改成这样:
setfenv(loadstring(code),newenv)()
原因是 load
和 loadstring
在 5.2 中合并了,访问环境只定义了访问 _ENV
变量,所以没有附加特定的环境一个函数了。