【发布时间】:2021-03-22 18:57:34
【问题描述】:
Go 的内置正则表达式 pkg 的文档在这里:https://golang.org/pkg/regexp/ Go 中的正则表达式测试器:https://regoio.herokuapp.com
我有一个预定义单词的列表:
christmas, santa, tree ( -> the order here is important. Check for words from left to right)
我正在尝试在不同的 url 字符串中检查上述单词之一:
/api/container/:containerID/santa ( -> I want back santa)
/api/tree/:containerID/ ( -> I want back tree)
/api/tree/:containerID/christmas ( -> I want back christmas, not tree)
我试过的正则表达式是:
re := regexp.MustCompile(`^(christmas)|(santa)|(tree)$`)
fmt.Println("santa? ", string(re.Find([]byte(`/api/container/:containerID/santa`))))
// output OK: santa? santa
fmt.Println("tree? ", string(re.Find([]byte(`/api/tree/:containerID/`))))
// output FAIL/EMPTY: tree?
fmt.Println("christmas? ", string(re.Find([]byte(`/api/tree/:containerID/christmas`))))
// output FAIL/EMPTY: christmas?
还尝试了以下方法,但返回的是孔字符串,而不是我正在寻找的单词:
re := regexp.MustCompile(`^.*(christmas).*|.*(santa).*|.*(tree).*$`
fmt.Println("santa? ", string(re.Find([]byte(`/api/container/:containerID/santa`))))
// output FAIL/HOLE URL BACK: santa? /api/container/:containerID/santa
fmt.Println("tree? ", string(re.Find([]byte(`/api/tree/:containerID/`))))
// output FAIL/FAIL/HOLE URL BACK: tree? /api/tree/:containerID/
string(re.Find([]byte(`/api/tree/:containerID/christmas`))))
// output FAIL/FAIL/HOLE URL BACK: christmas? /api/tree/:containerID/christmas
我不知道正则表达式“引擎”的最后一个表达式有什么问题,应该只记住括号内的内容。
【问题讨论】:
-
您希望这些词是整个 URL 段,还是子字符串匹配? IE。你想只匹配
/tree/还是/street/? -
另外,你能解释一下为什么目标词的顺序很重要吗?你说是,但你的代码似乎没有注意排序。
-
我希望它们成为整个 url 段。
-
好。这简化了事情。因此,最简单的解决方案是停止使用正则表达式(正则表达式几乎总是错误的工具),而是将路径拆分为多个段,然后遍历它们以查看是否匹配。
-
正则表达式并不是所有事情的正确工具。拆分 URL 路径和处理很简单。
标签: regex go url word predefined-variables