这将跳过1st 2个字符并开始从左到右匹配

re := regexp.MustCompile("(^.{2})(\\/path\\/subpath((\\/.*)|()))")
fmt.Println(re.MatchString("c:/path/subpath/path/subpath/")) // true
fmt.Println(re.MatchString("c:/patch/subpath/path/subpath/")) // false

注意第二个没有命中。即使/path/subpath存在于字符串中。太棒了。

现在,如果不知道要跳过多少个字符并想从第一个“/”开始搜索,那么我尝试了
re2 := regexp.MustCompile("([^\\/])(\\/path\\/subpath((\\/.*)|()))")
fmt.Println(re2.MatchString("cddddd:/path/subpath/path/subpath"))  // true

这是完美的。但是如果我改变第一条路
fmt.Println(re2.MatchString(“cddddd:/patch/subpath/path/subpath”))//同样如此

我不希望最后一个匹配第二个/path/subpath。我希望能够在第一组中搜索,从那里开始第二组,并从左到右进行匹配。

任何帮助将不胜感激。

最佳答案

它需要更精确地确定您想要的内容,以绝对的方式陈述您想要的内容,而不是像“第二名不应该匹配第三名”。相反,说;
如果第二组中以/path/subpath开头,我想捕获该路径。如果某个路径的开头晚于某个地方包含/path/subpath,那么我就不希望它匹配。
同样,斜杠在正则表达式中不是特殊的,因此您不需要白白地转义它们。
第三个表达式是这样做的:

  • 从头开始捕获所有不是斜线的 anchor
  • 将组1与组2分隔为:
  • 要求/path/subpath在
  • 路径的顶部
  • 捕获剩下的

  • 这可能是您想要的:
    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        paths := []string{
            "c:/path/subpath/path/subpath/",
            "c:/patch/subpath/path/subpath/",
            "cddddd:/path/subpath/path/subpath",
        }
    
        re1 := regexp.MustCompile("(^.{2})(/path/subpath(/.*))")
        re2 := regexp.MustCompile("([^/])(/path/subpath((/.*)|()))")
        re3 := regexp.MustCompile(`^([^/]+):/path/subpath(/.*)`)
    
        for i, re := range []*regexp.Regexp{re1, re2, re3} {
            i++
            for _, s := range paths {
                fmt.Println(i, re.MatchString(s), s)
                if re.MatchString(s) {
                    matches := re.FindStringSubmatch(s)
                    for m, g := range matches {
                        m++
                        if m > 1 {
                            fmt.Printf("\n\t%d %v", m, g)
                        }
                    }
                }
                println()
            }
            println()
        }
    }
    
    输出
    $ go run so-regex-path.go
    (...)
    
    3 true c:/path/subpath/path/subpath/
    
        2 c
        3 /path/subpath/
    3 false c:/patch/subpath/path/subpath/
    
    3 true cddddd:/path/subpath/path/subpath
    
        2 cddddd
        3 /path/subpath
    

    09-26 00:12