Eld*_*rum 8 regex backreference go
我需要在我的Go代码中匹配使用反向引用的正则表达式(例如\ 1).
这并不是那么容易,因为在Go中,官方的regexp软件包使用RE2引擎,该引擎选择不支持反向引用(以及其他一些鲜为人知的功能),以便可以保证线性时间执行,从而避免使用正则表达式拒绝服务攻击.RE2不支持启用反向引用支持.
在我的代码中,攻击者不存在恶意攻击的风险,我需要反向引用.
我该怎么办?
正则表达式非常适合使用常规语法,但如果你的语法不规则(即需要反向引用和类似的东西),你应该切换到更好的工具.有很多很好的工具可用于解析无上下文语法,包括默认情况下随Go分发一起提供的yacc.或者,您也可以编写自己的解析器.例如,可以手动编写递归下降解析器.
我认为正则表达式在脚本语言(如Perl,Python,Ruby,...)中被过度使用,因为它们的C/ASM驱动的实现通常比那些语言本身更优化,但Go不是这样的语言.正则表达式通常很慢,通常根本不适合这个问题.