如何制作重复捕获组?

时间:2018-02-19 14:16:21

标签: regex go

我正在尝试解析以下字符串:

`%%% First %%% part 1 %%% Second %%% part2`

这继续进入未知数量的部件......例如。第三,第四,另一个,汽车,飞机等...都被" %%% Something %%%"

我有:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    reg:= regexp.MustCompile(`(?P<part>%%% .* %%%)+`)
    match := reg.FindStringSubmatch(`%%% First %%% part 1 %%% Second %%% part2`)
    if len(match) == 0 {
        fmt.Println("not found")
    }

    for i, g := range reg.SubexpNames() {
        if i == 0 || g == "" {
            continue
        }

        switch g {
        case "part":
            fmt.Println("part:", match[i])
        default:
            fmt.Printf("what group %q", g)
        }
    }

}

给出:

part: %%% First %%% part 1 %%% Second %%%

如何获取输出,使其打印如下,其中第1部分和第2部分是单独的匹配组?我想忽略&#34; First&#34;完全专注于&#34; Second&#34;:

part 2

https://play.golang.org/p/wLFwnk02dIJ

2 个答案:

答案 0 :(得分:3)

这假设您尝试捕获的碎片遵循%%% Descriptor String %%% part的格式,它只会打印零件段。期待这种模式重复。

此外,我在收到的%%%中添加了给定字符串中缺少的内容。

使用这种模式,关闭%%%并不重要,但它们也不会造成伤害。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    reg := regexp.MustCompile(`%%%[^%]*%%%(?P<part>[^%]*)`)
    match := reg.FindAllStringSubmatch(`%%% First %%% part 1 %%% Second %%% part2 %%% Third %%% wobble wobble %%%`, -1)
    if len(match) == 0 {
        fmt.Println("not found")
    }

    for i, _ := range match {
        fmt.Println("part:", match[i][1])
    }
}

这将打印出来:

part: part 1 part: part2 part: wobble wobble

答案 1 :(得分:1)

请勿使用正则表达式,请使用拆分

package main

import (
    "fmt"
    "strings"
)

func main() {
    example := `%%% First %%% part 1 %%% Second %%% part2`

    other := strings.Split(example, "%%%")

    fmt.Println(other)
}