我有一个正则表达式,可以在Java和在线网站上创建极高的负载,帮助您测试正则表达式。正则表达式是:
import (\s*\w*\.*)*;
顺利运行
import bla.foo.bloo.blaf.blooo;
但似乎完全崩溃(只是继续无限处理)
import static bla.foo.bloo.somestatic.blaaaaaat.blooo.foo.*;
我想知道为什么会发生这种情况,两种方法都是使用
import (\s*\w*\.*\**)*;
但我不知道是什么造成了令人难以置信的沉重负担。
答案 0 :(得分:6)
我认为让它变慢的原因是你在括号内和外面都有星星。如果您有(\w*)*
之类的正则表达式并尝试匹配“foo”,则可以通过多种方式执行此操作:
(foo)
(fo)(o)
(f)(oo)
(f)(o)(o)
(这里的括号应理解为(\w*)
匹配一次)。
由于正则表达式是深度优先的,因此当你实际获得匹配时这不是问题,但是对于不匹配的字符串,它必须通过 all 之前的变化,如上所述它可能会得出结论,没有匹配。
对于长字符串,这是一个非常多的变体。每个新字符可以继续当前(\w*\s*\.*)
或开始一个新字符,复杂度为O(2 ^ n)。
尝试使用此结果可获得更快的结果:import [\w\s\.]*;
。