小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《跳过正则表达式字符,直到使用 golang 进行搜索》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!
问题内容这将跳过前 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
,那么我不希望它匹配。
此外,斜杠在正则表达式中并不特殊,因此您不需要无缘无故地对它们进行双重转义。
第三个表达式的作用是:
- 从起始锚点捕获除斜杠之外的所有内容
- 通过以下方式将组 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
到这里,我们也就讲完了《跳过正则表达式字符,直到使用 golang 进行搜索》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!