Соответствие шаблона Lua url - PullRequest
0 голосов
/ 24 октября 2018

У меня ниже URI:

  • /v1/resource1
  • /v1/resource1/{uuid}
  • /v1/resource1/{uuid}/resource2

Я пытался использовать/v1/resource1 и /v1/resource/+ как пара шаблонов, но второй шаблон соответствует как 2-му, так и 3-му URI

Я хочу иметь 3 отдельных шаблона, соответствующих вышеуказанным URI, отдельно.Я использую функцию string.match для сопоставления с образцом.

Может ли кто-нибудь помочь мне с шаблонами Lua?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Но я думаю, было бы лучше иметь универсальный шаблон, который работает для всех строк, имеющих одинаковую структуру.Поэтому вам следует избегать буквенных строк внутри шаблона (за исключением того, что вы ищете именно это).

list_url = {'/v1/resource1','/v1/resource1/{uuid}','/v1/resource1/{uuid}/resource2'}

patt1 = '^/[^/]+/[^/]+'
patt2 = patt1..'/%{[^}]+}'
patt3 = patt2..'/[^/]+'

for _, url in pairs(list_url) do
    print(url)
    print('\t', url:match(patt1..'$'))
    print('\t', url:match(patt2..'$'))
    print('\t', url:match(patt3..'$'))
end

output:

/v1/resource1
    /v1/resource1
    nil
    nil
/v1/resource1/{uuid}
    nil
    /v1/resource1/{uuid}
    nil
/v1/resource1/{uuid}/resource2
    nil
    nil
    /v1/resource1/{uuid}/resource2
0 голосов
/ 24 октября 2018

Вы можете использовать

string.match("/v1/resource1", "^/v1/resource%d*$")
string.match("/v1/resource1/{uuid}", "^/v1/resource1/[^/]*$")
string.match("/v1/resource1/{uuid}/resource2", "^/v1/resource1/[^/]*/[^/]*$")

См. онлайн Lua demo

Последние детали шаблона

  • ^ - начало строки
  • /v1/resource1/ - литеральная строка
  • [^/]* - 0 или более символов, отличных от /
  • / - a/ char
  • [^/]* - 0 или более символов, отличных от /
  • $ - конец строки.
...