我正在将一个库从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中获得这种功能;我应该如何重写这些表达式呢?

推荐答案

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

添加一些Ps,如here所定义:

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

交叉引用带有re.SubexpNames()的捕获组名称.

并使用as follows:

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

Go相关问答推荐

golang-jWT签名无效

如何在定制普罗米修斯出口商中测试动态计量注册?

调用API时使用nginx作为反向代理时从nginx获取502坏网关

获取作为类型参数传递给方法接收方中的类型参数的切片的基础类型

编辑时保留YAML文件中的单引号

Golang中的泛型 struct /接口列表

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

仅使用公共 api 对 alexedwards/scs 进行简单测试

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

如何将已知类型转换为指向switch 中类型参数的指针?

golang 中的可变参数函数

为超时的单元测试创​​建 deadlineExceededError:true

如何在Golang中的差异函数中杀死命令Exec

有没有办法在 golang 中定义可索引类型?

使用 Go 读取 TOML 文件时结果为空

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

go routine 和接收错误或成功的通道

函数参数的判断顺序是什么?