如何在golang regexp中匹配字符串或字符串结尾?

时间:2016-08-23 23:14:51

标签: regex go

我无法在正常表达式中(在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中有一个\ z但是不起作用,至少当我把它放在[-a-zA-Z/]里面时,[-a-zA-Z\\z/]

2 个答案:

答案 0 :(得分:2)

在模式的末尾加上?。这意味着前面的项目是可选的。

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

此外,您应该在RE周围使用反引号而不是双引号。这样你就不必逃避反斜杠了。

正如@Zan Lynx所提到的,只编译RE一次。

答案 1 :(得分:1)

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