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

Joe*_*jam 2 java regex perl

我有这个正则表达式模式

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

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

<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
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以帮我解决这个正则表达式的问题吗?

谢谢

Mar*_*ers 8

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

(?:\..*?)*\s+
Run Code Online (Sandbox Code Playgroud)

对此:

\..*\s
Run Code Online (Sandbox Code Playgroud)