灾难性的回溯问题

Catastrophic backtracking issue

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

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

^(?:".*?",){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",

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

将您的问题缩小到:

How to avoid catastrophic backtracking?

正则表达式方面:尽可能具体,正如 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=(.*?);

会有很大帮助。