如何在golang中使用regexp获取url模式?

时间:2015-05-27 06:03:03

标签: regex http go url-routing

如何使用正则表达式匹配URL,它决定使用相应的函数处理

cat myfile | perl -pe 's/,+[\t ]*/, /g;'

3 个答案:

答案 0 :(得分:6)

http.HandleFunc()不能用于注册模式以匹配正则表达式。简而言之,HandleFunc()处指定的模式可以匹配固定的根路径(如/favico.ico)或带根的子树(如/images/),较长的模式优先于较短的模式。您可以在ServeMux类型的文档中找到更多详细信息。

你可以做的是将你的处理程序注册到一个有根的子树,这可能是/模式的所有内容,在你的处理程序中你可以进行进一步的正则表达式匹配和路由。

例如:

func main() {
    http.HandleFunc("/", route) // Match everything
    http.ListenAndServe(":8080", nil)
}

var rNum = regexp.MustCompile(`\d`)  // Has digit(s)
var rAbc = regexp.MustCompile(`abc`) // Contains "abc"

func route(w http.ResponseWriter, r *http.Request) {
    switch {
    case rNum.MatchString(r.URL.Path):
        digits(w, r)
    case rAbc.MatchString(r.URL.Path):
        abc(w, r)
    default:
        w.Write([]byte("Unknown Pattern"))
    }
}

func digits(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Has digits"))
}

func abc(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Has abc"))
}

或使用像Gorilla MUX这样的外部库。

答案 1 :(得分:1)

我使用github.com/gorilla/mux包。所以路由器看起来像:

func main() {

    r := mux.NewRouter()

    r.HandleFunc("/{name:pattern}", handle)
    http.ListenAndServe(":8080", r)
}

其中{name:pattern}可以只是{slug}(没有模式)或{id:[0-9]+}或它们的组合/{category}/{id:[0-9]+}。并在处理程序函数中获取它们:

func handle(w http.ResponseWriter, r *http.Request) {

    params := mux.Vars(r)

    // for /{category}/{id:[0-9]+} pattern
    category := params["category"]
    id := params["id"]
}

运行它并尝试curl http://localhost:8080/whatever/1

答案 2 :(得分:0)

Golang没有内置的 regex 支持网址匹配。从头开始实施起来有点复杂。

使用框架可能是更好的选择,例如beegomartin等。