regex - 如何制作重复捕获组?

标签 regex go

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

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

这一直持续到未知数量的部分......例如Third, Fourth, Another, Car, Airplane, etc... 都被 "%%% 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 部分是单独的匹配组?我想完全忽略“第一”,只关注“第二”:

part 2

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

最佳答案

这假设您 try catch 的片段遵循 %%% 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])
    }
}

这将打印出:

部分:第 1 部分 部分:第2部分 部分:摆动摆动

关于regex - 如何制作重复捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868108/

相关文章:

java - 在java正则表达式中转义特殊字符(不引用)

javascript - 查找包含分隔符转义形式的子字符串(正则表达式)

gcc - 如何修复对 `nettle_sha256_digest` 的 undefined reference ?

http - 使用 mime/multipart 上传会损坏文件

regex - 正则表达式匹配模式一次或多次,没有部分匹配

C# 正则表达式模式难题

unit-testing - 在 golang 中实现嵌套接口(interface)

go - 检查方法类型是否与函数类型匹配

unit-testing - Testify 似乎同时运行测试套件?

ruby - 将 %uXXXX 替换为 Ruby 中相应的 Unicode 代码点