Cela dépend si vous avez une expression régulière ou une expression rationnelle: les expressions régulières sont mauvaises, mais les expressions régulières sont une chose de beauté et ne vous transformeront jamais en mal.
Par expression régulière, je veux dire une expression régulière moderne: c'est-à-dire une expression régulière avec des fonctionnalités modernes supplémentaires telles que les références arrières - par exemple, une expression régulière compatible Perl. Ceci est plus puissant qu'une expression régulière classique d'un manuel de théorie formelle des langages / automates, car les expressions régulières classiques ne permettent pas les références arrières, l'anticipation, la recherche, etc.
Pour une expression régulière classique, si vous avez une bonne implémentation pour le matcher, alors aucune expression régulière n'est trop mauvaise. En particulier, un algorithme standard de correspondance consiste à convertir l'expression régulière en NFA, puis à exécuter le NFA sur une chaîne d'entrée. Pour cet algorithme, le temps d'exécution le plus défavorable pour tester une chaîne de caractères est O ( n ) , lorsque l'expression régulière est fixe. Cela signifie que le temps de fonctionnement ne peut pas exploser trop rapidement. Aucune chaîne ne provoquera une augmentation exponentielle du temps d'exécution. Ainsi, si vous utilisez un matcher qui utilise cet algorithme, aucune expression régulière classique ne sera mauvaise.nO(n)
Cela dépend de l'implémentation de la correspondance d'expression régulière. Si vous avez une implémentation naïve ou médiocre de la correspondance, la correspondance peut prendre un temps exponentiel; il existe certainement des algorithmes avec cette propriété. Mais la meilleure réponse à cela n'est probablement pas de changer l'expression régulière; il est probablement préférable de choisir un meilleur match, si vous êtes préoccupé par les attaques par déni de service.
En comparaison, certains regexps modernes sont inévitablement mauvais. Si vous avez une expression rationnelle moderne, la correspondance peut nécessiter un temps exponentiel. En particulier, les expressions rationnelles avec des références arrières peuvent reconnaître les langages NP-hard. Par conséquent, sous des hypothèses plausibles, il existe une classe de regexps maléfiques où le test d'une correspondance prend un temps exponentiel. Ainsi, certaines expressions rationnelles modernes sont inévitablement mauvaises: il n'y a aucun moyen possible de trouver une expression rationnelle équivalente qui ne provoquera pas une explosion exponentielle en temps d'exécution.
(Un tel équivalent pourrait exister et pourrait même être trouvé en théorie, mais sous des hypothèses plausibles, trouver l'expression rationnelle équivalente prendra un temps exponentiel, ce qui n'est pas possible en pratique. Si vous aviez une procédure systématique pour trouver l'expression rationnelle équivalente en temps polynomial , alors vous pourriez résoudre le problème NP-difficile en temps polynomial, prouvant que P = NP. Il n'y a pas grand-chose de bon pour qu'il existe une expression rationnelle équivalente s'il n'y a aucun moyen de le trouver dans votre vie.)
Contexte et sources: