大猩猩 Mux 正则表达式

Gorilla Mux Regex

我正在为我的路线使用 Golang Gorilla Toolkit 的 Mux 包。

考虑以下路线:

m.HandleFunc("/admin/install", installHandler).Methods("GET")
m.HandleFunc("/admin/^((?!install).)*$", adminHandler).Methods("GET")
m.HandleFunc("/admin", adminHandler).Methods("GET")

问题出在中间路线的正则表达式上——它没有被解释,所以路线将不起作用!

m.HandleFunc("/admin/{^((?!install).)*$}", adminHandler).Methods("GET")

使用 {} 大括号也不起作用。它只是被忽略,并被视为 /admin/

也没有:

m.HandleFunc("/admin/{_dummy:^((?!install).)*$}", adminHandler).Methods("GET")

简而言之,我在这里试图实现的是首先匹配 /admin/install 路线,然后我想使用正则表达式从下面的路线中排除那条确切的路线,但它没有没用。

有什么方法可以在 gorilla mux 包中使用正则表达式吗?

它不起作用,因为 golang 正则表达式遵循 re2 syntax,它不支持先行或后行。

您可能需要先为 /admin/install .
定义处理程序 那么所有其他 /admin/xxx 将用于其他路线(即不是 /admin/install

实际上,OP SK84 adds :

Even if admin/install is defined first, /admin/ will also be executed. That's what I wanted to avoid.

I guess I need to code around it inside the admin handler then - easy, but not as pretty as this would have been if it had worked.

实际上可以这样做:

m.HandleFunc(`/{_dummy:admin\/([^install]*).*}`, adminHandler).Methods("GET")

编辑:

作为我对 VonC 上面评论的回答,这里有一个示例 go 应用程序:https://play.golang.org/p/nYWNADK7Sr

运行 它在您的本地电脑上。尝试以下路线:

http://localhost:8080/admin/ - (returns "adminHandler")
http://localhost:8080/admin/something - (returns "adminHandler")
http://localhost:8080/admin/install - (returns "installHandler")

是的,VonC,它确实解决了具体问题:

"to first match the /admin/install route, and that exact route I then want to exclude from the route below"

但是它并不意味着 "not followed by the word, install" 是正确的 - 这只是在 re2 语法范围内可能的替代方法。简单地 "ignore" 或排除安装一词,如果它恰好出现在 url.