package main import ( "fmt" "regexp" "time" ) const ParamsRegexPattern = "(:[\\w_]+)" type URIMatcher struct { ParamsMatcher *regexp.Regexp } func (um *URIMatcher) Check(schema, real string) (b bool) { wildcardParamSelector := um.ParamsMatcher.ReplaceAllString(schema, ".+?") return regexp.MustCompile(wildcardParamSelector).MatchString(real) } func main() { parregex, _ := regexp.Compile(ParamsRegexPattern) um := URIMatcher{ParamsMatcher: parregex} // Basic Matching fmt.Println("Matching A:", um.Check("http://coba.com/:data/oke/:data", "http://coba.com/123/oke/something")) fmt.Println("Matching B:", um.Check("http://coba.com/:data/oke/:data", "http://coba.com/123/oke")) // Benchmarking Basic st := time.Now() for i := 0; i < 1000; i++ { ok := um.Check("http://coba.com/:data/oasdasdaskeoasdasdaskeoasdasdaskeoasdasdaske/:data/oke/:data/oke/", "http://coba.com/123/oasdasdaskeoasdasdaskeoasdasdaskeoasdasdaske/123/oke/123/oke/") if !ok { panic("wrong result!") } } dur := time.Since(st) fmt.Println("1000 matching done in", dur, "est ops latency", dur/1000) // Printed Result: // Matching A: true // Matching B: false // 1000 matching done in 23.416141ms est ops latency 23.416µs }