2010-08-01 5 views
1

J'ai quelques expressions régulières dans un script Perl qui sont correctes mais lentes. J'envisage d'essayer d'améliorer les performances en ajoutant des opérateurs supplémentaires (c'est-à-dire * + au lieu de * et ++ au lieu de +) pour désactiver le backtracking. J'ai essayé de les remplacer tous et les expressions régulières ont cessé de fonctionner ... autant pour la solution simple. Comment est-ce que je sais où je peux les ajouter où il ne cassera pas la regex?amélioration des performances de Perl regex en ajoutant +

+2

Pouvez-vous poster une partie de l'expression rationnelle nécessitant une optimisation? L'optimisation par exemple peut vous aider à mieux comprendre dans quels cas il convient d'utiliser certaines optimisations. – strager

Répondre

6

Si les regexes ont cessé de fonctionner, soit vous n » est t en utilisant une version de perl qui les supporte, ou vous avez réellement besoin de faire marche arrière dans ces cas. Identifier les sections de la regex qui n'auront jamais besoin d'un retour arrière (c'est-à-dire que si on leur demande de correspondre à partir d'un point donné, il n'y aura jamais plus d'une longueur) et les entourer avec (?> ). Cela a le même effet que ++/* + et est supporté même avant 5.10. Notez que la restriction du retour arrière n'est souvent pas une "optimisation", car elle modifie ce qui sera et ce qui ne sera pas adapté. L'idée est que vous l'utilisiez pour mieux décrire ce que vous voulez réellement correspondre. Emprunter de l'article lié dans la réponse OP, quelque chose comme ^(.*?,){11}P (douzième champ séparés par des virgules commence P) est non seulement inefficace, il est incorrect, puisque le retour arrière le fera correspondre même quand un seul champ après le douzième commence par P. En le corrigeant à ^(?>.*?,){11}P, vous le restreignez à réellement correspondre au nombre correct de champs principaux. (Dans ce cas trivial, ^([^,]*,){11}P fait également le travail, mais si vous ajoutez le support des virgules échappées ou entre guillemets dans les champs en utilisant l'alternance, (?> devient le choix le plus facile.)

Questions connexes