为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的正则表达式问题

Golang 中的正则表达式问题

Go
神不在的星期二 2022-10-24 15:24:40
我正在尝试创建一个正则表达式来解析特定的字符串。当前字符串是abcd_1.263.0.15-8zz00df.yml,我只想从中解析1.263.0.15-8zz00df出来。已经尝试使用此表达式"_\K.*(?=\.)",但它在 Golan 中不起作用并给我模式错误。有人可以帮忙吗?
查看完整描述

4 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-10-24
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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


查看完整回答
反对 回复 2022-10-24
?
动漫人物

TA贡献1815条经验 获得超10个赞

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

_(\S+)\.yml$
  • _匹配前导下划线

  • (\S+)在第 1 组中捕获 1+ 个非空白字符

  • \.yml匹配.yml

  • $字符串结束

查看正则表达式演示

例如

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+)\.

查看另一个正则表达式演示



查看完整回答
反对 回复 2022-10-24
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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

_(.*)\.

贪婪匹配,这*意味着它将匹配所有内容,直到最后一个 '.' - 这正是你所需要的。您的比赛在第 1 组。


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

_(.*)(?=\.)

第 1 组包含您的比赛。

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


查看完整回答
反对 回复 2022-10-24
  • 4 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信