【问题标题】:skip regex chars until search using golang跳过正则表达式字符,直到使用 golang 搜索
【发布时间】:2020-09-20 10:36:56
【问题描述】:

这将跳过前 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。我希望能够在第一组中搜索,从那里开始第二组并进行从左到右的匹配。

任何帮助将不胜感激。

【问题讨论】:

    标签: regex go


    【解决方案1】:

    更准确地说你想要什么是值得的,用绝对的方式陈述你想要什么,而不是像“第二个不应该匹配第三个”。相反,说;

    如果路径以第二组中的/path/subpath 开头,我想捕获它。如果路径包含/path/subpath 的某个位置晚于开头,那么我不希望它匹配。

    此外,正则表达式中的斜杠并不特殊,因此您无需对它们进行双重转义。

    第三个表达式,这样做:

    1. 从起始锚点捕获不是斜线的所有内容
    2. 通过以下方式将组 1 与组 2 分隔:
    3. 要求 /path/subpath 位于路径的顶部
    4. 捕获任何剩余的东西

    这可能是你想要的:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2013-06-06
      • 2013-09-23
      • 1970-01-01
      • 2022-11-15
      • 2017-06-15
      相关资源
      最近更新 更多