如何在复杂的golang正则表达式捕获中捕获多个组

时间:2020-06-25 04:13:48

标签: regex go

我的正则表达式有点麻烦。

鉴于下面的文本行,我想创建一个捕获 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条目

1 个答案:

答案 0 :(得分: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

相关问题