大猩猩Mux Regex

时间:2015-03-09 19:50:27

标签: regex go mux gorilla

我使用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包中使用正则表达式?

2 个答案:

答案 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 /。这就是我想要避免的。

     

我想我需要在管理处理程序内部对它进行编码 - 这很简单,但不如它已经工作的那样漂亮。