Dipende dal fatto che tu abbia un'espressione regolare o una regexp: le regexps sono malvagie, ma le espressioni regolari sono una cosa di bellezza e non trasformeranno mai il male in te.
Per regexp intendo un'espressione regolare moderna: vale a dire un'espressione regolare con caratteristiche moderne aggiuntive come i riferimenti indietro - ad esempio, un'espressione regolare compatibile con Perl. Ciò è più potente di un'espressione regolare classica da un manuale di teoria dei linguaggi / automi formali, poiché le espressioni regolari classiche non consentono riferimenti indietro, lookahind, lookbehind e così via.
For a classical regular expression, if you have a good implementation for the matcher, then no regular expression is too evil. In particular, a standard algorithm for matching is to convert the regular expression to a NFA and then executing the NFA on an input string. For this algorithm, the worst-case running time to test a n-character string is O(n), when the regular expression is fixed. This means that the running time can't explode too rapidly. There is no string that will cause an exponential increase in running time. Thus, if you're using a matcher that uses this algorithm, no classical regular expression will be evil.
This does depend on the implementation of the regular expression matcher. If you have a naive or poor implementation of the matcher, then matching could take exponential time; there are certainly algorithms with that property. But the best answer to that is probably not to change the regular expression; it's probably better to pick a better matcher, if you are concerned about denial-of-service attacks.
In confronto, alcune regexps moderne sono inevitabilmente malvagie. Se hai una regexp moderna, la corrispondenza può richiedere tempo esponenziale. In particolare, regexps con backreferences possono riconoscere le lingue NP-hard. Di conseguenza, sotto ipotesi plausibili, esiste una classe di regexps malvagi in cui il test per una partita richiede tempo esponenziale. Pertanto, alcune regexp moderne sono inevitabilmente malvagie: non esiste un modo fattibile per trovare una regexp equivalente che non causi lo scoppio esponenziale del tempo di esecuzione.
(Un simile equivalente potrebbe esistere e potrebbe anche essere reperibile in teoria, ma in base a ipotesi plausibili, trovare la regexp equivalente richiederà tempo esponenziale, il che non è fattibile in pratica. Se avessi una procedura sistematica per trovare la regexp equivalente in tempo polinomiale , quindi potresti risolvere il problema NP-difficile in tempo polinomiale, dimostrando che P = NP. Non fa molto bene che esista una regexp equivalente se non c'è modo di trovarlo effettivamente nella tua vita.)
Contesto e fonti: