【问题标题】:Issue with regex in GolangGolang 中的正则表达式问题
【发布时间】:2022-01-07 06:55:24
【问题描述】:

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

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

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

【问题讨论】:

标签: regex go regex-group


【解决方案1】:

Go 使用 RE2 正则表达式引擎,不支持 lookaheadslookbehinds 和其他 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

【讨论】:

    【解决方案2】:

    只是用一句话转发@mkopriva 的一个sn-ps,

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

        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

    【讨论】:

      【解决方案3】:

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

      _(.*)\.
      

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


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

      _(.*)(?=\.)
      

      第 1 组包含您的匹配项。

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

      【讨论】:

      • 我试过了,但使用时出错? regex101.com/r/I9r2kw/1
      • @johnwatson 我简化了正则表达式,它现在应该可以工作了。
      • 感谢@Stefan..但新模式包括下划线和点从开始 n 结束这是不期望的
      • 您应该使用第 1 组,因为您需要的匹配在第 1 组中。您可以在 regex101 链接的右侧看到它。在此处了解有关组的更多信息:stackoverflow.com/a/14484091/9698467
      • 谢谢@Stefan.. 你能告诉我如何使用这个组 1...
      【解决方案4】:

      为了更精确地匹配该字符串格式,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用\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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-18
        • 2011-01-25
        • 1970-01-01
        相关资源
        最近更新 更多