【问题标题】:How do I capture multiple groups in a complicated golang regexp capture如何在复杂的 golang 正则表达式捕获中捕获多个组
【发布时间】:2020-06-26 14:01:33
【问题描述】:

我的正则表达式有点问题。

鉴于以下文本行,我想创建一个正则表达式来捕获 dll 和 TLB 文件名,括号前的文本和括号后的版本号。

Enabler .Net API (ITL.Enabler.Api.dll, ITL.Enabler.Api_pcl.dll, ITL.Enabler.API.TLB) v1.3.2

事实上,我希望它也能捕获 *.sys、*.exe。

这是我到目前为止与 dll 匹配的内容。

([\w .]*.dll)

但不会同时捕获两个组。只有最后一个文件在组中。如何让它捕获所有文件?

为了获取版本号,我期望如下所示。版本格式为 v1.2.n.n n.n 是可选的。

(v\d.{2,})

我希望能够在一行中捕获 *.dll、*.sys、*.tlb 等。 我希望扩展名不区分大小写。

所以像这样的事情就是这样做的。 ([\w .]*.[d|D][l|L][l|l])

---更新---

代码:

txt := "Enabler .Net API (ITL.Enabler.Api.dll, ITL.Enabler.Api_pcl.dll, ITL.Enabler.API.TLB) v1.3.2"
re := regexp.MustCompile(`(?i)([\w .]*\.dll)`)
match := re.FindStringSubmatch(txt)

for i := range match {
    fmt.Println(match[i])
}

我要捕获的是所有 dll 版本以及任何以 sys 和 exe 和 tlb 结尾的文件。然后我想要版本号。

不确定如何重复捕获。它只显示最后一个 dll 条目

【问题讨论】:

  • [d|D] - 此字符集表示d|D 字符之一。其中有3个会被接受。如果你想要d or D,那就是[dD]
  • 真的很难理解你的问题是什么。您能否展示您的最佳代码尝试,并说明它的作用以及您真正想要获得的内容。关于 golang 中不区分大小写的正则表达式:stackoverflow.com/a/15326471/251311
  • @zerkms - 我已经编辑了我的问题

标签: regex go


【解决方案1】:

我会为库和版本建议两种不同的正则表达式。以下代码对给定字符串执行相同操作

package main

import (
    "fmt"
    "regexp"
)

func main() {

    txt := "Enabler .Net API (ITL.Enabler.Api.dll, ITL.Enabler.Api_pcl.dll, ITL.Enabler.API.TLB) v1.1.3"
    libRE := regexp.MustCompile(`(?i)([\w_.]+\.(dll|sys|exe|tlb))`)
    versionRE := regexp.MustCompile(`v(\d+\.)*\d+`)

    libraries := libRE.FindAllString(txt, -1)
    version := versionRE.FindString(txt)
    for _, lib := range libraries {
        fmt.Println(lib)
    }
    fmt.Println(version)
}

在这里结帐代码:https://play.golang.org/p/Hh4B23biKE5

【讨论】:

  • 如何使 versionRE 匹配 v1.1 或 v1.1.1 或 v1.1.1.1 格式?
  • @Matt 您可以对 version 使用更宽松的正则表达式。 v(\d+\.)*\d 用正则表达式更新了答案
  • 我已经修正了你的答案。 1.2.2.10 被捕获为 1.2.2.1 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多