大猩猩 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.
我正在为我的路线使用 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.