Lua:正则表达式和Lua模式

local code = [[
client_script 'Bait.lua'

client_script 'Test.lua' --Test
]]

我要如何编写一个包含所有介于 client_script '' --Test 之间内容的正则表达式/模式?

点赞
用户1424244
用户1424244

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

原因是在 5.2 中合并了 loadloadstring,只能通过访问 _ENV 变量来定义访问环境,因此函数不再具有特定的环境。

2021-02-19 14:05:04