如何匹配golang正则表达式中的字符或字符串结尾?
在正则表达式中,我无法解决(在golang中)如何匹配字符,分隔符或字符串尾部。下面几乎做什么,我想:如何匹配golang正则表达式中的字符或字符串结尾?
url := "test20160101"
if i, _ := regexp.MatchString("[-a-zA-Z/]20[012]\\d[01]\\d[0123]\\d[-a-zA-Z/]", url); i == true {
t := regexp.MustCompile("[-a-zA-Z/](20[012]\\d[01]\\d[0123]\\d)[-a-zA-Z/]").FindStringSubmatch(url)[1]
fmt.Println("match: ", t)
}
https://play.golang.org/p/eWZ_DiOVBl
但我想也符合以下:
url := "test-20160101-"
url := "/20160101/page.html"
我注意到有在the golang documentation一个\ž但这并不工作,至少当我把它放在里面[-a-zA-Z/]
即[-a-zA-Z\\z/]
我很感兴趣,只是为了好玩而玩。也许是这样的:https://play.golang.org/p/GRVnHTwW0g
package main
import (
"fmt"
"regexp"
)
func main() {
// Want to match "test-20160101", "/20160101/" and "test-20160101"
re := regexp.MustCompile(`[-a-zA-Z/](20[012]\d[01]\d[0123]\d)([-a-zA-Z/]|\z)`)
urls := []string{
"test-20160101",
"/20160101/page.html",
"test20160101",
"nomatch",
"test19990101",
}
for _, url := range urls {
t := re.FindStringSubmatch(url)
if len(t) > 2 {
fmt.Println("match", url, "=", t[1])
}
}
}
挽救生命。这完美地解决了它。我会修改你的帖子,以澄清可能会有更多的网址结束 – Jacob
把?
放在e nd的模式。这意味着前面的项目是可选的。
如果要将模式锚定在匹配字符串的末尾,请在最后(在?
之后)输入$
(或\z
)。
此外,你应该使用backquotes而不是双引号引起你的RE。这样你就不必逃避反斜杠。
而@赞恩山猫提到,只编译一次RE。
有用的回复,但是可能有更多的字符串,否则我会做到这一点。我会更新这个问题来澄清这一点。 – Jacob
只是关于正则表达式编译的一个注意事项,以防您习惯于像在问题中那样编写它。正则表达式编译*是昂贵的*。做一次并存储结果。最近看到了一些代码在循环中执行了MustCompile。这是一个非常缓慢的错误。 –
是的,你不应该把'\ z'放在字符类中。它会匹配那里的文字“z”。 – Bergi
@ZanLynx好的指针。它只是我的测试代码,但我们不希望人们效仿它。 – Jacob