【发布时间】:2020-06-05 03:43:34
【问题描述】:
我正在创建一个日志服务,它将接受来自不同客户端的大量日志语句。我需要允许我的客户配置某些文本简化,例如:
- 用“*”替换任何由空格或非斜线标点分隔的 UUID。
- 用“*”替换某个前缀之后的任何内容。
- 用“*”替换斜线之间的所有数字。
文本简化将取决于客户用例,但我希望正则表达式自然适合。但是,由于正则表达式可能会遭受灾难性的回溯,因此一位客户可能会使用错误的正则表达式破坏服务器。
所以我不能使用正则表达式,我正在寻找一些具有更严格复杂性保证的替代方法。对表达式作者施加更高的负担是可以接受的(并且可能是必要的)。
我一直在谷歌搜索,但找不到合适的东西。
【问题讨论】:
-
我见过将更简单的模式语言编译为正则表达式的应用程序,例如
###.*变为/[0-9]{3}\.\S*/。但我不知道有任何通用的、开箱即用的解决方案。 -
您可能想查看RE2 library,它不是回溯实现,因此可以保证线性性能。 (为了保证这一点,它没有实现某些功能,例如需要回溯的反向引用匹配。但限制并不严重。)
-
@rici 非常有趣。我必须记住那个。我觉得这接近 OP 的要求,尽管它似乎不支持替换。 OP 可能必须自己实现该部分。
-
regex101.com 有一个灾难性的回溯警告,并且还实现了超时,因此您可以为您的日志服务查看此类内容。