我正在把Ruby的一个库移植到Go语言中,刚刚发现Ruby中的正则表达式与Go语言(google RE 2)不兼容,我注意到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语言的正则表达式中获得这种功能呢?我应该怎么改写这些表达式呢?
8条答案
按热度按时间sczxawaw1#
基于@VasileM答案确定组名称的简单方法。
免责声明:这与内存/cpu/时间优化无关
https://play.golang.org/p/Y9cIVhMa2pU
gwo2fgha2#
如果在捕获组时需要根据函数进行替换,可以使用以下命令:
示例:
https://gist.github.com/elliotchance/d419395aa776d632d897
brc7rcf03#
您可以将
regroup
库用于该https://github.com/oriser/regroup示例:
将打印:
map[Year:2015 Month:05 Day:27]
或者,您可以按如下方式使用它:
将打印:
&{Year:2015 Month:5 Day:27}
soat7uwm4#
用于获取regexp参数的函数,检查指针是否为空。如果发生错误,则返回map[]
6tr1vspr5#
我应该怎么改写这些表达式呢?
添加一些P,定义为here:
使用
re.SubexpNames()
交叉引用捕获组名。并使用as follows:
svujldwt6#
我已经创建了一个处理url表达式的函数,但它也适合你的需要。你可以检查this片段,但它的工作原理是这样的:
您可以像这样使用此函数:
并且输出将是:
zpgglvta7#
为了提高RAM和CPU的使用率,而不用在循环中调用匿名函数,也不用使用"append"函数在循环中复制内存中的数组,请参见下一个示例:
你可以用多行文本存储多个子组,不需要在字符串后面加上"+",也不需要在for循环中使用for循环(就像这里发布的其他例子一样)。
输出:
Note: res[i][0] =~ match.group(0) Java
如果要存储此信息,请使用结构类型:
最好使用匿名组(性能改进)
使用Github上发布的"ReplaceAllGroupFunc"是个坏主意,因为:
1.正在使用循环中循环
1.正在循环内使用匿名函数调用
1.有很多代码
1.在循环中使用了"append"函数,这很糟糕。每次调用"append"函数时,都会将数组复制到新的内存位置
b09cbbtk8#
从GO 1.15开始,您可以使用
Regexp.SubexpIndex
来简化这个过程,您可以在www.example.com上查看发行说明https://golang.org/doc/go1.15#regexp。根据您的示例,您将得到如下内容:
您可以在https://play.golang.org/p/ImJ7i_ZQ3Hu上检查并执行此示例。