Clojure маршрутизация, биди, регулярные выражения, которые я использую для маршрутов, не совпадают идеально - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужна помощь в построении некоторых маршрутов, у меня есть следующая схема маршрутов,

   (def my-routes

        ["/" {"" :home

              "info" :info

              "posts/" {"" :all-posts

                        [#"\d+" :tag-name] :post-by-tag

                        [#"\w+" :post-name] :post-by-name}}])

, но когда я делаю некоторые тесты, кажется, что есть проблема с регулярным выражением.Например:

    ;; testing the tag route
    (match-route my-routes "/posts/213")
    ;; => {:route-params {:tag-name "3"}, :handler :post-by-tag}

    ;; testing the name route
    (match-route my-routes "/posts/the-first-post")
    ;; => {:route-params {:post-name "-first-post"} , 
                          :handler :post-by-name}

Таким образом, кажется, что обрезать часть после "/", и когда я делаю это вне биди при обычной проверке повторных совпадений, это выглядит нормально

    (re-matches #"\d+" "213")
     ;; => "213"

    ;; I do see that this regex wouldn't pass the example I used above, but 
    ;; the main matter is this weird behaviour seen in the routing.
    (re-matches #"\w+" "post")
    ;; => "post"

Если бы кто-нибудь мог предоставить какое-нибудь регулярное выражение для разбора этих маршрутов, оно было бы очень признательно

Редактировать :

После замены регулярного выражения и попытки использовать его с match-routeкажется, только вернуть последнюю букву:

(use 'bidi.bidi)
;; => nil

(def my-routes
  ["/" {"" :home

        "info" :info

        "posts/" {"" :all-posts
                  [#"\d+" :tag-name] :post-by-tag
                  [#"[\w\-]+" :post-name] :post-by-name}

        }]

)
;; => #'user/my-routes

(match-route my-routes "/posts/the-first-post")
;; => {:route-params {:post-name "t"}, :handler :post-by-name}

1 Ответ

1 голос
/ 11 апреля 2019

\w не соответствует знаку минус:

(re-matches #"\w+" "the-first-post" )
=> nil

Вы, вероятно, хотите использовать [\w\-] вместо:

(re-matches #"[\w\-]+" "the-first-post" )
"the-first-post"
...