Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在复杂的golang regexp捕获中捕获多个组_Regex_Go - Fatal编程技术网

如何在复杂的golang regexp捕获中捕获多个组

如何在复杂的golang regexp捕获中捕获多个组,regex,go,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) 但并不能同时抓住这两个群体。组中只有最后一个文件。如何让它捕获所有文件

我的正则表达式有点问题

给定下面一行文本,我想创建一个正则表达式来捕获 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])

---更新---

代码:

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


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

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

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)
}

此处的签出代码:

[d | d]
-此字符集表示
d
d
字符之一。其中3个会被接受。如果您想要
d或d
,那将是
[dD]
,很难理解您的问题是什么。请您展示您的最佳代码尝试,并说明它的作用以及您真正想要获得的内容。关于golang中不区分大小写的正则表达式:@zerkms-我已经编辑了我的问题:如何使versionRE匹配v1.1或v1.1.1或v1.1.1格式?@Matt您可以对版本使用更宽松的正则表达式
v(\d+\)*\d
用正则表达式更新了答案我已经修复了你的答案。1.2.2.10被视为1.2.2.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)
}