2015-03-01 3 views
1

я борюсь с этой проблемой:проблемы с Lua соответствует найти модель

Учитывая 2 строки:

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

Я хотел бы произвести следующую информацию:

  1. Если они совпадают (эти два значения должны совпадать, s2 следует шаблону, описанному в s1).

  2. Таблица, содержащая значения s2 с соответствующим именем в s1. В этом случае мы имеем: { bar = "lua", rab = "rocks" }

Я думаю, что этот алгоритм решает, но я не могу понять, как его реализовать (возможно, с gmatch):

  1. магазин заполнители : индексы как КЛЮЧИ таблицы, и соответствующие ЗНАЧЕНИЯ, являющиеся именем этих заполнителей.

    Пример с s1:

    local aux1 = { "6" = "bar", "15" = "rab" } 
    
  2. С ключами aux1 извлечённому в качестве индексов, извлечения значения s2 в другую таблицу:

    local aux2 = {"6" = "lua", "15" = "rocks"} 
    
  3. Наконец объединить их два в одну таблицу (это легко: P)

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

На шаге 2 вы используете индексы из s1 для поиска в s2, это работает только после того, как «: bar» имеет такую ​​же длину, как «lua», так будет всегда? – ryanpattison

+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 
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 
Смежные вопросы