package desktop import ( "encoding/json" "regexp" "strings" ) type MatchResult struct { Params map[string]string `json:"params"` Match bool `json:"match"` Origin string `json:"origin"` Pattern string `json:"pattern"` } func (r *MatchResult) String() string { b, err := json.Marshal(r) if err != nil { return "" } return string(b) } func (r *MatchResult) GetParam(key string) string { return r.Params[key] } func ParseKey(pattern string) string { index := strings.Index(pattern, "/:") if index < 0 || index > len(pattern)-2 { return "" } str := pattern[index+1:] end := strings.Index(str, "/") if end == -1 { end = len(str) } key := str[0:end] return key } // ParsePathParam 解析路径中的 :id 字段 func ParsePathParam(path string, pattern string) *MatchResult { var result = &MatchResult{ Match: false, Params: map[string]string{}, Origin: path, } var keys []string var reg = pattern for i := 0; true; i++ { key := ParseKey(reg) if len(key) == 0 { break } keys = append(keys, key[1:]) reg = strings.ReplaceAll(reg, key, "(.+)?") } result.Pattern = reg compile := regexp.MustCompile(reg) match := compile.FindStringSubmatch(path) if len(match) < 1 { return result } result.Match = true for i := 1; i < len(match); i++ { k := keys[i-1] result.Params[k] = match[i] } return result }