这将跳过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
,那么我就不希望它匹配。
同样,斜杠在正则表达式中不是特殊的,因此您不需要白白地转义它们。
第三个表达式是这样做的:
这可能是您想要的:
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