Lua Regex函数声明

时间:2017-02-13 18:28:48

标签: function lua lua-patterns

我想解析lua文件中的所有lua函数声明。例如,我们假设我已经获得了此代码:

function foo(a, b, c)
    local d = a + b
    local e = b - c
    return d *e
end

function boo(person)
    if (person.age == 18) then
        print("Adult")
    else
        print("Kid")
    end

    if (person.money > 20000) then
        print("Rich")
    else
        print("poor")
    end
end

我想得到这样的结果:

Group[1]:
    local d = a + b
    local e = b - c
    return d *e

Group[2]:
    if (person.age == 18) then
        print("Adult")
    else
        print("Kid")
    end

    if (person.money > 20000) then
        print("Rich")
    else
        print("poor")
    end

基本上,我想在功能声明和最后一端之间使用函数体。但是,我想出了这个:

(?<=function)(.*?)(?=end)

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

如果你的所有函数定义都在第1列开始和结束,那么这就可以了:

L=[[

function foo(a, b, c)
    local d = a + b
    local e = b - c
    return d *e
end

function boo(person)
    if (person.age == 18) then
        print("Adult")
    else
        print("Kid")
    end

    if (person.money > 20000) then
        print("Rich")
    else
        print("poor")
    end
end
]]

for b in L:gmatch("\nfunction.-\n(.-)\nend") do
    print("------------------")
    print(b)
end

请注意,代码顶部需要一个空行才能找到第一个函数。

答案 1 :(得分:0)

以下是一些函数将输出文件的函数体,只要函数定义在第一列中开始和结束,并且只要使用[local] function ...或{{1定义函数}}。还有一项用于检测单行函数定义的规定。

函数[local] fname = function ...是一个迭代器,它返回包含函数体的行的表。如果func_bodies()未开始函数定义,is_func_def()函数将返回nilline函数使用迭代器并打印结果。请注意,在函数定义之前或之间不需要空行。

show_funcs()

以下是一个示例互动:

function is_func_def (line)
   return string.match(line, "^function%s+") or
          string.match(line, "^local%s+function%s+") or
          string.match(line, "^local%s+[%w_]+%s*=%s*function%s+") or
          string.match(line, "^[%w_]+%s*=%s*function%s+")
end

function func_bodies (file)
   local body
   local in_body = false
   local counter = 0
   local lines = io.lines(file)
   return function ()
      for line in lines do
         if in_body then
            if string.match(line, "^end") then
               in_body = false
               return counter, body
            else
               table.insert(body, line)
            end
         elseif is_func_def(line) then
            counter = counter + 1
            body = {}
            if string.match(line, "end$") then
               table.insert(body, string.match(line, "%)%s+(.+)%s+end$"))
               return counter, body
            else
               in_body = true
            end
         end
      end
      return nil
   end
end

function show_funcs (file)
   for i, body in func_bodies(file) do
      io.write(string.format("Group[%d]:\n", i))
      for k, v in ipairs(body) do
         print(v)
      end
      print()
   end
end

以下是用于上述测试的文件:

> show_funcs("test_funcs3.lua")
Group[1]:
   local a = 2*x
   local b = 2*y
   return a + b

Group[2]:
   local c = x / 2
   local d = y / 2
   return c - d

Group[3]:
   local a = x + 1
   local b = y + 2
   return a * b

Group[4]:
   local a = x - 1
   local b = y - 2
   return a / 2 - b / 2

以下是添加了一些单行函数的示例代码:

function f_1 (x, y)
   local a = 2*x
   local b = 2*y
   return a + b
end
local function f_2 (x, y)
   local c = x / 2
   local d = y / 2
   return c - d
end
g_1 = function (x, y)
   local a = x + 1
   local b = y + 2
   return a * b
end
local g_2 = function (x, y)
   local a = x - 1
   local b = y - 2
   return a / 2 - b / 2
end

示例互动:

function foo(a, b, c)
    local d = a + b
    local e = b - c
    return d *e
end
function boo(person)
    if (person.age == 18) then
        print("Adult")
    else
        print("Kid")
    end

    if (person.money > 20000) then
        print("Rich")
    else
        print("poor")
    end
end

function f1 (x, y) return x + y; end
local function f2 (x, y) return x - y; end
g1 = function (x, y) return x * y; end
local g2 = function (x, y) return x / y; end