Itu tergantung pada apakah Anda memiliki ekspresi reguler atau regexp: regexps itu jahat, tetapi ekspresi reguler adalah sesuatu yang indah dan tidak akan pernah mengubah kejahatan pada Anda.
Dengan regexp, maksud saya ekspresi reguler modern: yaitu, ekspresi reguler dengan fitur modern tambahan seperti backreferences - misalnya, ekspresi reguler Perl-kompatibel. Ini lebih kuat daripada ekspresi reguler klasik dari buku teks teori bahasa / automata formal, karena ekspresi reguler klasik tidak mengizinkan referensi, melihat ke belakang, melihat ke belakang, dan sebagainya.
Untuk ekspresi reguler klasik, jika Anda memiliki implementasi yang baik untuk pencocokan, maka tidak ada ekspresi reguler yang terlalu jahat. Secara khusus, algoritma standar untuk pencocokan adalah untuk mengubah ekspresi reguler ke NFA dan kemudian mengeksekusi NFA pada string input. Untuk algoritma ini, waktu menjalankan kasus terburuk untuk menguji string -character adalah O ( n ) , ketika ekspresi reguler diperbaiki. Ini berarti waktu berjalan tidak dapat meledak terlalu cepat. Tidak ada string yang akan menyebabkan peningkatan waktu berjalan yang eksponensial. Jadi, jika Anda menggunakan pencocokan yang menggunakan algoritme ini, tidak ada ekspresi reguler klasik yang akan jahat.nO ( n )
Ini tergantung pada implementasi pencocokan ekspresi reguler. Jika Anda memiliki implementasi korek yang naif atau buruk, maka pencocokan dapat membutuhkan waktu yang eksponensial; pasti ada algoritma dengan properti itu. Tetapi jawaban terbaik untuk itu mungkin tidak mengubah ekspresi reguler; mungkin lebih baik untuk memilih pencocokan yang lebih baik, jika Anda khawatir tentang serangan penolakan layanan.
Sebagai perbandingan, beberapa regexps modern tidak bisa dihindari jahat. Jika Anda memiliki regexp modern, maka pencocokan dapat memerlukan waktu eksponensial. Secara khusus, regexps dengan backreferences dapat mengenali bahasa NP-hard. Akibatnya, di bawah asumsi yang masuk akal, ada kelas regexps jahat di mana pengujian untuk pertandingan membutuhkan waktu yang eksponensial. Dengan demikian, beberapa regexps modern tidak terhindarkan jahat: tidak ada cara yang layak untuk menemukan regexp setara yang tidak akan menyebabkan ledakan eksponensial dalam menjalankan waktu untuk mencocokkan.
(Setara seperti itu mungkin ada dan bahkan mungkin dapat ditemukan dalam teori, tetapi di bawah asumsi yang masuk akal, menemukan regexp yang setara akan memakan waktu eksponensial, yang dalam praktiknya tidak layak. Jika Anda memiliki prosedur sistematis untuk menemukan regexp yang setara dalam waktu polinomial , maka Anda dapat memecahkan masalah NP-hard dalam waktu polinomial, membuktikan bahwa P = NP. Tidak ada gunanya bagi di sana untuk memiliki regexp yang setara jika tidak ada cara yang benar-benar menemukannya dalam masa hidup Anda.)
Latar belakang dan sumber: