我使用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路由,然后我想要使用正则表达式从下面的路由中排除该确切路由,但它没有&#39工作。
有没有办法在gorilla mux包中使用正则表达式?
答案 0 :(得分:4)
实际上可以这样做:
m.HandleFunc(`/{_dummy:admin\/([^install]*).*}`, adminHandler).Methods("GET")
编辑:
作为我对上述VonC评论的回答,这里有一个示例转到应用: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,它确实解决了具体问题:
"首先匹配/ admin / install路由,然后我确切的路由 想要从下面的路线中排除"
但这是正确的,它并不意味着"后面没有单词,install" - 这只是一种可能的范围内的替代方法。 re2语法。简单地“忽略”"如果它恰好出现在网址中,则排除安装一词。
答案 1 :(得分:1)
它不起作用,因为golang regexp遵循re2 syntax,它不支持前瞻或后瞻。
您可能需要先为/admin/install
定义处理程序
然后所有其他/admin/xxx
将用于其他路线(即不是/admin/install
)
实际上,OP SK84添加了in the comments:
即使首先定义了admin / install,也会执行/ admin /。这就是我想要避免的。
我想我需要在管理处理程序内部对它进行编码 - 这很简单,但不如它已经工作的那样漂亮。