正则表达式花费太长时间来匹配结果

时间:2010-12-29 10:45:24

标签: java regex perl

我有这个正则表达式

<(\d+)>(\d+\.\d+|\d{4}\-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\..*?)*\s+(ALER|NOTI)

这是我的输入(根本不匹配)

<150>2010-12-29 18:11:30.883 -0700 192.168.2.145 80 192.168.2.87 2795 "-" "-" GET HTTP 192.168.2.145 HTTP/1.1 200 36200 0 1038 544 192.168.2.221 80 540  SERVER DEFAULT PASSIVE VALID /joomla/ "-" http://192.168.2.145/joomla/index.php?option=com_content&view=a be4d44e8f3986183a87991398c1c212e=1;      be4d44e8f3986183a87991398c1c212e=1

这将返回不匹配的结果,但输出结果需要很长时间。由于我在一秒钟内有一千个日志/输入,因此每个日志/输入都应该非常快。有时它达到CPU 100%。

有人可以帮我解决这个正则表达式问题吗?

由于

3 个答案:

答案 0 :(得分:8)

由于表达式(?:\..*?)*可以匹配的方式很多,因此会发生灾难性的回溯。可能必须检查数百万个匹配项,并随着字符串中的点数呈指数增长。要解决此问题,您可以更改此信息:

(?:\..*?)*\s+

到此:

\..*\s

答案 1 :(得分:3)

看起来你正在寻找一些日期/时间/等。有关ALER / NOTI线的信息。 你不能只通过首先点击ALER / NOTI来解析这些行吗? 那么在那些有趣的行上运行正则表达式可能会容易得多(并且它可能会简化正则表达式)。

答案 2 :(得分:2)

由于你没有提供一个有效的例子,唯一要说明为什么它的慢 这是(?:\..*?)*这是多么奇怪。元时期。匹配包括文字在内的任何内容 期。那个表达式表示,如果有一个文字句点,那就得到它,并且一切都达到\ s 但是,字面时间是可选的。

(?:\.(?:(?!\s(?:ALER|NOTI)).)*?)?\s+(ALER|NOTI)

这本身就很古怪。如果扩展可以查看。

(?:
    \.
    (?:
        (?!\s(?:ALER|NOTI)).
    )*?
)?
\s+
(ALER|NOTI)