如何匹配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/]

+1

只是关于正则表达式编译的一个注意事项,以防您习惯于像在问题中那样编写它。正则表达式编译*是昂贵的*。做一次并存储结果。最近看到了一些代码在循环中执行了MustCompile。这是一个非常缓慢的错误。 –

+0

是的,你不应该把'\ z'放在字符类中。它会匹配那里的文字“z”。 – Bergi

+0

@ZanLynx好的指针。它只是我的测试代码,但我们不希望人们效仿它。 – Jacob

我很感兴趣,只是为了好玩而玩。也许是这样的: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]) 
     } 
    } 
} 
+0

挽救生命。这完美地解决了它。我会修改你的帖子,以澄清可能会有更多的网址结束 – Jacob

?放在e nd的模式。这意味着前面的项目是可选的。

如果要将模式锚定在匹配字符串的末尾,请在最后(在?之后)输入$(或\z)。

此外,你应该使用backquotes而不是双引号引起你的RE。这样你就不必逃避反斜杠。

而@赞恩山猫提到,只编译一次RE。

+0

有用的回复,但是可能有更多的字符串,否则我会做到这一点。我会更新这个问题来澄清这一点。 – Jacob