Lua匹配问题找到一个模式

时间:2015-03-01 13:07:08

标签: lua lua-patterns

我正在努力解决这个问题:

给出2个字符串:

s1 = '/foo/:bar/oof/:rab'
s2 = '/foo/lua/oof/rocks'

我想提供以下信息:

  1. 如果它们匹配(上述两个应匹配,则s2遵循s1中描述的模式)。

  2. s2中包含s1 in值且相应名称的表格。在这种情况下,我们会:{ bar = "lua", rab = "rocks" }

  3. 我认为这个算法解决了它,但我无法想象如何实现它(可能与gmatch一起):

    1. 将占位符:索引存储为表的KEYS,相应的VALUES是这些占位符的名称。

      s1的示例:

      local aux1 = { "6" = "bar", "15" = "rab" }
      
    2. aux1的键作为索引获取,提取s2的值 进入另一张桌子:

      local aux2 = {"6" = "lua", "15" = "rocks"}
      
    3. 最后将两个合并为一个表(这个很容易:P)

      { bar = "lua", rab = "rocks" }
      

2 个答案:

答案 0 :(得分:0)

这样的事情可能是:

function comp(a,b)
  local t = {}
  local i, len_a = 0
  for w in (a..'/'):gmatch('(.-)/') do
    i = i + 1
    if w:sub(1,1) == ':' then
      t[ -i ] = w:sub(2)
    else
      t[ i ] = w
    end
  end
  len_a = i
  i = 0
  local ans = {}
  for w in (b..'/'):gmatch('(.-)/') do
    i = i + 1
    if t[ i ] and t[ i ] ~= w then
      return {}
    elseif t[ -i ] then
      ans[ t[ -i ] ] = w
    end
  end
  if len_a ~= i then return {} end
  return ans
end

s1 = '/foo/:bar/oof/:rab'
s2 = '/foo/lua/oof/rocks'

for k,v in pairs(comp(s1,s2)) do print(k,v) end

答案 1 :(得分:0)

另一种解决方案可能是:

s1 = '/foo/:bar/oof/:rab'
s2 = '/foo/lua/oof/rocks'
pattern = "/([^/]+)"

function getStrngTable(_strng,_pattern)
    local t = {}
    for val in string.gmatch(_strng,_pattern) do
        table.insert(t,val)
    end
    return t
end
local r = {}
t1 = getStrngTable(s1,pattern)
t2 = getStrngTable(s2,pattern)
for k = 1,#t1 do
    if (t1[k] == t2[k]) then
        r[t1[k + 1]:match(":(.+)")] = t2[k + 1]
    end
end

r将具有所需的结果

下面的解决方案,也就是清洁工,也会给出相同的结果:

 s1 = '/foo/:bar/oof/:rab'
 s2 = '/foo/lua/oof/rocks'
 pattern = "/:?([^/]+)"

 function getStrng(_strng,_pattern)
     local t = {}
     for val in string.gmatch(_strng,_pattern) do
         table.insert(t,val)     
     end
     return t
 end
 local r = {}
 t1 = getStrng(s1,pattern)
 t2 = getStrng(s2,pattern)


 for k = 1,#t1 do
     if (t1[k] == t2[k]) then
         r[t1[k + 1]] = t2[k + 1]
     end
 end