【问题标题】:Catastrophic backtracking issue灾难性的回溯问题
【发布时间】:2016-12-26 13:25:54
【问题描述】:

当没有找到匹配项时,我遇到了正则表达式模式的问题。

我使用的正则表达式模式是:

^(?:".*?",){4}"(?:.*?)Cookie:\s(?:.*?)Routing=(.*?);

作为测试数据,我使用了类似的东西:

"a","b","c","d","POST: /portal/start.asp HTTP/1.1\r\nHost: myhost\r\nCookie: w1n0_er=xxxx; routxing=yyyy;"x","x","x","x","x","x","x","x","x","x","x","x","x","x","x","x","x",

找到“路由”参数后,一切正常。但是,当从测试数据中排除路由参数未找到时,正则表达式会继续搜索。我从其他帖子中发现这是由灾难性回溯引起的,但我似乎找不到避免它的方法。

【问题讨论】:

  • 一个好的开始方法是将".*?"更改为"[^"]*"
  • 你真正想搜索什么?
  • 既然你已经知道在哪里搜索,先提取第5个引用的字符串,然后检查它是否包含你想要的。
  • 您的输入包含大量双引号字符串。这是您在 ".*?" 模式上遇到灾难性回溯的两个主要原因之一,该模式扩展了太多次以满足引擎。

标签: regex backtracking


【解决方案1】:

将您的问题缩小到:

如何避免灾难性的回溯?

正则表达式方面:尽可能具体,正如Rawing 在他的评论中所说,将".*?" 更改为"[^"]*" 将大大减少引擎所需的回溯次数。

输入站点:如果可能,将输入减少到您需要的最小部分,而不会丢失信息。在这里,更改您的输入:

"a","b","c","d","POST: /portal/start.asp HTTP/1.1\r\nHost: myhost\r\nCookie: w1n0_er=xxxx; routxing=yyyy;"x","x","x","x","x","x","x","x","x","x","x","x","x","x","x","x","x",

"POST: /portal/start.asp HTTP/1.1\r\nHost: myhost\r\nCookie: w1n0_er=xxxx; Routing=yyyy;"

和正则表达式:

^".*?Cookie:\s.*?Routing=(.*?);

会有很大帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 2016-03-24
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多