正则表达式创造了非常重的负载

时间:2015-07-22 07:43:42

标签: java regex

我有一个正则表达式,可以在Java和在线网站上创建极高的负载,帮助您测试正则表达式。正则表达式是:

import (\s*\w*\.*)*;

顺利运行
import bla.foo.bloo.blaf.blooo;

但似乎完全崩溃(只是继续无限处理)

import static bla.foo.bloo.somestatic.blaaaaaat.blooo.foo.*;

我想知道为什么会发生这种情况,两种方法都是使用

import (\s*\w*\.*\**)*;

但我不知道是什么造成了令人难以置信的沉重负担。

1 个答案:

答案 0 :(得分:6)

我认为让它变慢的原因是你在括号内和外面都有星星。如果您有(\w*)*之类的正则表达式并尝试匹配“foo”,则可以通过多种方式执行此操作:

(foo)
(fo)(o)
(f)(oo)
(f)(o)(o)

(这里的括号应理解为(\w*)匹配一次)。

由于正则表达式是深度优先的,因此当你实际获得匹配时这不是问题,但是对于不匹配的字符串,它必须通过 all 之前的变化,如上所述它可能会得出结论,没有匹配。

对于长字符串,这是一个非常多的变体。每个新字符可以继续当前(\w*\s*\.*)或开始一个新字符,复杂度为O(2 ^ n)。

尝试使用此结果可获得更快的结果:import [\w\s\.]*;