【问题标题】:A safe regex alternative一个安全的正则表达式替代品
【发布时间】:2020-06-05 03:43:34
【问题描述】:

我正在创建一个日志服务,它将接受来自不同客户端的大量日志语句。我需要允许我的客户配置某些文本简化,例如:

  • 用“*”替换任何由空格或非斜线标点分隔的 UUID。
  • 用“*”替换某个前缀之后的任何内容。
  • 用“*”替换斜线之间的所有数字。

文本简化将取决于客户用例,但我希望正则表达式自然适合。但是,由于正则表达式可能会遭受灾难性的回溯,因此一位客户可能会使用错误的正则表达式破坏服务器。

所以我不能使用正则表达式,我正在寻找一些具有更严格复杂性保证的替代方法。对表达式作者施加更高的负担是可以接受的(并且可能是必要的)。

我一直在谷歌搜索,但找不到合适的东西。

【问题讨论】:

  • 我见过将更简单的模式语言编译为正则表达式的应用程序,例如###.* 变为 /[0-9]{3}\.\S*/。但我不知道有任何通用的、开箱即用的解决方案。
  • 您可能想查看RE2 library,它不是回溯实现,因此可以保证线性性能。 (为了保证这一点,它没有实现某些功能,例如需要回溯的反向引用匹配。但限制并不严重。)
  • @rici 非常有趣。我必须记住那个。我觉得这接近 OP 的要求,尽管它似乎不支持替换。 OP 可能必须自己实现该部分。
  • regex101.com 有一个灾难性的回溯警告,并且还实现了超时,因此您可以为您的日志服务查看此类内容。

标签: regex parsing


【解决方案1】:

我建议在后端使用正则表达式,同时不要将正则表达式引擎暴露给客户;客户可以获得使用正则表达式实现的预定义替换选项菜单。

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多