猿问

Golang 中的正则表达式问题

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

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

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


神不在的星期二
浏览 106回答 4
4回答

扬帆大鱼

Go使用RE2正则表达式引擎,它不支持前瞻、后瞻和其他 PCRE 好东西,如\K请参阅不同正则表达式引擎的比较。但是,您可以使用此正则表达式:[^_-]+-[^.]+请参阅此演示。解释:[^_-]+   # a character that is not "_" or "-", one or more times-        # a literal "-"[^.]+    # a character that is not a dot, one or more times

拉风的咖菲猫

只需用一句话重新发布@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)

动漫人物

对于该字符串格式的更精确匹配,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用\S而不是._(\S+)\.yml$_匹配前导下划线(\S+)在第 1 组中捕获 1+ 个非空白字符\.yml匹配.yml$字符串结束查看正则表达式演示。例如package mainimport (    "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+)\.查看另一个正则表达式演示。

至尊宝的传说

编辑:您可以简单地使用正则表达式:_(.*)\.贪婪匹配,这*意味着它将匹配所有内容,直到最后一个 '.' - 这正是你所需要的。您的比赛在第 1 组。你为什么使用\K匹配器?你的正则表达式是这样工作的:_(.*)(?=\.)第 1 组包含您的比赛。注意:测试正则表达式的一个非常有用的工具是这个站点:https ://regexr.com/
随时随地看视频慕课网APP

相关分类

Go
我要回答