代码之家  ›  专栏  ›  技术社区  ›  Harry

通过regexp从url路径中删除特定路径

  •  1
  • Harry  · 技术社区  · 8 年前

    Golang有很多方法可以移除特定字符串。 但这次我需要使用regexp。

    func Replace(path, from, to string) string {
        reg, _ := re.Compile(from)
        if reg.MatchString(path) {
            return reg.ReplaceAllString(path, to)
        }
        return "error"
    }
    
    //This pattern is OK
    fmt.Println(Replace("/nl/amsterdam/area2/area1", `\/+(?:area1|area2).+(/|\z)`, "$1"))
    // Output: /nl/amsterdam
    
    //What is wrong??
    fmt.Println(Replace("/nl/amsterdam/area2", `\/+(?:area1|area2).+(/|\z)`, "$1"))
    // Output: error
    // I expect => /nl/amsterdam
    
    fmt.Println(Replace("/nl/amsterdam/area2", `\/+(?:area1|area2)(/|\z)`, "$1"))
    // Output: /nl/amsterdam
    // This pattern seems OK, but when path is `/nl/amsterdam/area2/area1`, it doesn't work as I expected like the next pattern.
    
    fmt.Println(Replace("/nl/amsterdam/area2/area1", `\/+(?:area1|area2)(/|\z)`, "$1"))
    // Output: /nl/amsterdam/area1
    // I wanna get /nl/amsterdam
    

    路径中包含多少个目标是可变的。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Wiktor Stribiżew    8 年前

    您可以使用以下正则表达式:

    (?:/(?:area1|area2))+(/|$)
    

    请参见 regex demo .

    细节

    • (?:/(?:area1|area2))+ -以下序列出现一次或多次:
      • / -a / char(无需在Go regex模式中转义)
      • (?:area1|area2) -非捕获组匹配 area1 area2 (也可以替换为 area[12] 或者只是 area\d+ 匹配 area 和1+位数)
    • (/|$) -第1组:任一 / 或字符串结尾( \z 将匹配字符串的最末端)。