一尘不染

如何在Go正则表达式中获取捕获组功能

go

我正在将库从Ruby移植到Go,并且刚刚发现Ruby中的正则表达式与Go(google
RE2)不兼容。引起我注意的是Ruby&Java(以及其他语言使用PCRE正则表达式(与perl兼容,支持捕获组)),因此我需要重新编写表达式,以便它们可以在Go中编译。

例如,我有以下正则表达式:

`(?<Year>\d{4})-(?<Month>\d{2})-(?<Day>\d{2})`

这应该接受输入,例如:

2001-01-20

捕获组允许将年,月和日捕获为变量。要获得每个小组的价值,这很容易;您只需用组名索引返回的匹配数据,然后取回值。因此,例如,要获取年份,应类似于以下伪代码:

m=expression.Match("2001-01-20")
year = m["Year"]

这是我在表达式中经常使用的一种模式,因此我需要做很多重写工作。

因此,有没有办法在Go regexp中获得这种功能?我应该如何重写这些表达式?


阅读 410

收藏
2020-07-02

共1个答案

一尘不染

我应该如何重写这些表达式?

添加一些诗篇,如定义在这里

(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2})

使用交叉引用捕获组名称re.SubexpNames()

并使用如下

package main

import (
    "fmt"
    "regexp"
)

func main() {
    r := regexp.MustCompile(`(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2})`)
    fmt.Printf("%#v\n", r.FindStringSubmatch(`2015-05-27`))
    fmt.Printf("%#v\n", r.SubexpNames())
}
2020-07-02