Düzenli bir ifade veya regexp olup olmadığınıza bağlıdır: normal ifadeler kötüdür, ancak düzenli ifadeler güzel bir şeydir ve asla size kötülük getirmeyecektir.
Normal ifade ile, modern bir düzenli ifade kastediyorum: yani, backreferences gibi ek modern özelliklere sahip düzenli bir ifade - örneğin, Perl uyumlu bir düzenli ifade. Bu, klasik düzenli ifadeler backreferences, lookahead, lookbehind, vb. İzin vermediği için, resmi diller / otomata teorisi ders kitabındaki klasik düzenli ifadeden daha güçlüdür.
nO ( n )
Bu, normal ifade eşleştiricisinin uygulanmasına bağlıdır. Eşleştiricinin naif veya kötü bir uygulaması varsa, eşleme üstel zaman alabilir; kesinlikle bu özelliğe sahip algoritmalar vardır. Ancak bunun en iyi yanıtı muhtemelen normal ifadeyi değiştirmek değildir; hizmet reddi saldırılarından endişe ediyorsanız, daha iyi bir eşleşme seçmek muhtemelen daha iyidir.
Buna karşılık, bazı modern düzenli ifadeler kaçınılmaz olarak kötüdür. Modern bir normal ifadeniz varsa, eşleme üstel zaman gerektirebilir. Özellikle, backreferences içeren regexps NP-sert dilleri tanıyabilir. Sonuç olarak, akla yatkın varsayımlar altında, bir eşleşme için testin üstel zaman aldığı bir kötü regexps sınıfı vardır. Bu nedenle, bazı modern normal ifadeler kaçınılmaz olarak kötüdür: çalışma zamanında üstel patlamaya neden olmayacak eşdeğer bir normal ifade bulmanın mümkün bir yolu yoktur.
(Böyle bir eşdeğer var olabilir ve teoride bile bitirilebilir, ancak makul varsayımlar altında, eşdeğer normal ifadeyi bulmak, uygulamada mümkün olmayan üstel zaman alacaktır. Polinom zamanında eşdeğer normal ifadeyi bulmak için sistematik bir prosedürünüz varsa , NP-zor problemini polinom zamanında çözebilir ve P = NP olduğunu kanıtlayabilirsiniz. Ömrünüz boyunca gerçekten bulmanın bir yolu yoksa, eşdeğer bir regexp olması çok iyi olmaz.)
Arka plan ve kaynaklar: