我正在努力解决这个问题:
给出2个字符串:
s1 = '/foo/:bar/oof/:rab'
s2 = '/foo/lua/oof/rocks'
我想提供以下信息:
如果它们匹配(上述两个应匹配,则s2遵循s1中描述的模式)。
在s2
中包含s1
in值且相应名称的表格。在这种情况下,我们会:{ bar = "lua", rab = "rocks" }
我认为这个算法解决了它,但我无法想象如何实现它(可能与gmatch一起):
将占位符:
索引存储为表的KEYS,相应的VALUES是这些占位符的名称。
s1
的示例:
local aux1 = { "6" = "bar", "15" = "rab" }
将aux1
的键作为索引获取,提取s2
的值
进入另一张桌子:
local aux2 = {"6" = "lua", "15" = "rocks"}
最后将两个合并为一个表(这个很容易:P)
{ bar = "lua", rab = "rocks" }
答案 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