2016-08-19 69 views
1

如果找不到匹配项,我遇到了正则表达式模式的问题。灾难性的回溯问题

我用的正则表达式是:

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

当“路由”参数被发现,一切运作良好。但是,如果通过排除测试数据找不到路由参数,那么正则表达式将继续搜索。我发现其他帖子发现这是由灾难性的回溯造成的,但我似乎无法找到避免它的方法。

+4

开始的一个好方法是将''。*?“'改为'”[^“] *”' –

+0

你真的想要搜索什么? –

+1

既然你已经知道在哪里搜索,第一个是第五个引用的字符串,在检查它是否包含你想要的内容之后 –

回答

2

缩小你的问题:

如何避免灾难性的回溯?

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

将有很大的帮助。