Lua:正则表达式和 Lua 模式

问题描述

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)()

原因是 loadloadstring 在 5.2 中合并了,访问环境只定义了访问 _ENV 变量,所以没有附加特定的环境一个函数了。