Java 正则表达式需要的时间太长,无法匹配结果

Java 正则表达式需要的时间太长,无法匹配结果,java,regex,perl,Java,Regex,Perl,我有这个正则表达式模式 <(\d+)>(\d+\.\d+|\d{4}\-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\..*?)*\s+(ALER|NOTI) (\d+\.\d+\\d{4}-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\…*?)*\s+(ALER | NOTI) 这是我的输入(完全不匹配) 2010-12-2918:11:30.883-0700192.168.2.14580192.168.2.872795“-”获取HTTP

我有这个正则表达式模式

<(\d+)>(\d+\.\d+|\d{4}\-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\..*?)*\s+(ALER|NOTI)
(\d+\.\d+\\d{4}-\d+\-\d+\s+\d{2}:\d{2}:\d{2})(?:\…*?)*\s+(ALER | NOTI)
这是我的输入(完全不匹配)

2010-12-2918:11:30.883-0700192.168.2.14580192.168.2.872795“-”获取HTTP 192.168.2.145HTTP/1.12003620001038544192.168.2.22180540服务器默认被动有效/joomla/“-”http://192.168.2.145/joomla/index.php?option=com_content&view=a be4d44e8f3986183a87991398c1c212e=1;be4d44e8f3986183a87991398c1c212e=1
这将返回不匹配的结果,但输出结果所需时间太长。因为我在一秒钟内有上千个日志/输入,所以对于每一个日志/输入,它应该完成得非常快。有时它达到CPU的100%

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


谢谢

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

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

\..*\s

看起来您正在查找有关ALER/NOTI行的一些日期/时间/等信息。 你不能先把ALER/NOTI变灰来解析这些行吗?
然后,在这些有趣的行上运行正则表达式可能会容易得多(而且它可能会简化正则表达式)。

因为您没有提供一个工作示例,所以唯一需要说明的是为什么它很慢
这是
(?:\..*?)*
,很奇怪。元周期。匹配任何内容,包括文字
时期该表达式表示,如果存在文字句点,则获取该句点并将其全部添加到\s中。
但是,文字句点是可选的

(?:\.(?:(?!\s(?:ALER|NOTI)).)*?)?\s+(ALER|NOTI)
这本身就很奇怪。如果展开,可以查看它

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