Golang 中的正则表达式问题

Issue with regex in Golang

我正在尝试创建一个正则表达式来解析特定字符串。

当前字符串是 abcd_1.263.0.15-8zz00df.yml,我只想从中解析 1.263.0.15-8zz00df

已经尝试使用此表达式 "_\K.*(?=\.)" 但它在 Golan 中不起作用并且给我模式错误。有人可以帮忙吗?

编辑: 您可以简单地使用正则表达式:

_(.*)\.

*是贪婪匹配的,也就是说它会匹配所有的东西,直到最后一个'.'。 - 这正是您所需要的。你的比赛在第 1 组。


为什么要使用 \K 匹配器?您的正则表达式是这样工作的:

_(.*)(?=\.)

第 1 组包含您的比赛。

注意:测试正则表达式的一个非常有用的工具是这个站点:https://regexr.com/

只是用一句话重新发布@mkopriva 的片段之一,

并非所有事情都需要用正则表达式来完成:

    s := "abcd_1.263.0.15-8zz00df.yml"

    if i := strings.IndexByte(s, '_'); i > -1 {
        s = s[i+1:]
    }
    if i := strings.LastIndexByte(s, '.'); i > -1 {
        s = s[:i]
    }

    fmt.Println(s)

playground

Go 使用 RE2 正则表达式引擎,不支持 lookaheads, lookbehinds 和其他 PCRE 好东西,如 \K

查看不同正则表达式引擎的comparison

但是你可以使用这个正则表达式:

[^_-]+-[^.]+

看到这个demo

解释:

[^_-]+   # a character that is not "_" or "-", one or more times
-        # a literal "-"
[^.]+    # a character that is not a dot, one or more times

为了更精确地匹配该字符串格式,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用 \S 而不是 .

_(\S+)\.yml$
  • _ 匹配前导下划线
  • (\S+) 在组 1 中捕获 1+ 个非空白字符
  • \.yml 匹配 .yml
  • $ 字符串结束

看到一个regex demo

例如

package main
import (
    "fmt"
    "regexp"
)

func main(){
    re := regexp.MustCompile(`_(\S+)\.yml$`)
    res := re.FindStringSubmatch("abcd_1.263.0.15-8zz00df.yml")
    fmt.Printf("%v", res[1])
}

输出

1.263.0.15-8zz00df

或更广泛的匹配,捕获直到最后一次出现点之前:

_(\S+)\.

再看一个regex demo