我有这个正则表达式
<(\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%。
有人可以帮我解决这个正则表达式问题吗?
由于
答案 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)