如何在Go中匹配正则表达式和反向引用?

Eld*_*rum 8 regex backreference go

我需要在我的Go代码中匹配使用反向引用的正则表达式(例如\ 1).

这并不是那么容易,因为在Go中,官方的regexp软件包使用RE2引擎,该引擎选择不支持反向引用(以及其他一些鲜为人知的功能),以便可以保证线性时间执行,从而避免使用正则表达式拒绝服务攻击.RE2不支持启用反向引用支持.

在我的代码中,攻击者不存在恶意攻击的风险,我需要反向引用.

我该怎么办?

tux*_*21b 9

正则表达式非常适合使用常规语法,但如果你的语法不规则(即需要反向引用和类似的东西),你应该切换到更好的工具.有很多很好的工具可用于解析无上下文语法,包括默认情况下随Go分发一起提供的yacc.或者,您也可以编写自己的解析器.例如,可以手动编写递归下降解析器.

我认为正则表达式在脚本语言(如Perl,Python,Ruby,...)中被过度使用,因为它们的C/ASM驱动的实现通常比那些语言本身更优化,但Go不是这样的语言.正则表达式通常很慢,通常根本不适合这个问题.

  • 正则表达式与非常规语法不匹配. (6认同)
  • @ridgerunner这就是为什么它们被称为*extended*正则表达式. (4认同)
  • @tomwilde - 当然可以.现代正则表达式工具中的引擎还没有"[常规](http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html#comment_40"请参阅Perl骆驼书的作者撰写的评论")"几十年了. (3认同)

Eld*_*rum 8

在这里回答我自己的问题,我使用golang-pkg-pcre解决了这个问题,它使用libpcre ++,支持反向引用的perl正则表达式.API 不一样.