Supposons que vous voulez faire correspondre le texte qui est délimité par des caractères doubles comme ceci: (. *)assorti doubles ombles chaînes délimitées avec des expressions régulières
a = <<
Hello
World!
>>
L'expression régulière/< < >>/sembleraient faire , mais malheureusement, quand ceux-ci peuvent être répétées correspondant avide devient trop:
a = <<
Hello
World!
>>
b = <<
Goodbye
World!
>>
précédent regexp capture
Hello
World!
>>
b = <<
Goodbye
World!
La réponse évidente est de faire le regexp non gourmand: (. *?)/< < >>/
Malheureusement, cela a des problèmes de performances extrêmes pour les longues chaînes (en Perl au moins). Si les délimiteurs étaient des caractères uniques, nous pourrions utiliser une classe de caractères (tout sauf le caractère) pour résoudre le problème glouton.
Des idées sur une expression régulière pour faire correspondre ce match sans la pénalité de performance?
NB: je dois utiliser Perl et cela doit être une expression régulière en raison du système plus grand, il est intégré dans
Merci..
Phil - pourriez-vous élaborer sur «doit être une expression régulière en raison du plus grand système dans lequel il est intégré»? Cela semble être un travail mieux adapté à un analyseur (tel que Text :: Balanced) qu'un RegEx. – DVK
Essayez de regarder la deuxième réponse à cette question: http://stackoverflow.com/questions/2975950/is-it-better-to-use-a-non-greedy-qualifier-or-a-lookahead – Josiah
Votre affirmation que Faire une regex non gourmande "a des problèmes de performances extrêmes" me semblait contre-intuitif. J'aurais pensé qu'un non-gourmand devrait être plus rapide puisqu'il peut s'arrêter au premier match alors que la version gourmande doit continuer et éventuellement revenir en arrière. J'ai donc fait quelques tests avec différentes longueurs de cordes et expressions régulières et je n'ai jamais vu le problème de performance auquel vous vous référez. Utilisez-vous un match ancré dans votre regex? –