2008-12-07 9 views
2

Je veux faire correspondre un bloc de code plusieurs fois fois dans un fichier, mais ne peut pas travailler sur l'expression régulière pour ce faire. Un exemple du bloc de code est:Expression régulière pour faire correspondre les blocs de code plusieurs fois

//@debug 
... 
// code in here 
... 
//@end-debug (possibly more comments here on same line) 

Chaque bloc de code que je suis en train de match commence avec //@debug et arrêter à la fin de la ligne contenant //@end-debug

Je possède ce au moment:

/(\/{2}\@debug)(.|\s)*(\/{2}\@end-debug).*/ 

Mais cela correspond à un gros bloc de la première //@debug tout le chemin à la fin de la ligne de la dernière //@end-debug dans le fichier.

Des idées?

Répondre

6

Fondamentalement, votre expression régulière est gourmande. Cela signifie que les opérateurs génériques saisissent autant qu'ils le peuvent avec les résultats que vous avez vus. Changez juste pour non-gourmand le cas échéant. Dans votre cas, utilisez:

/(/{2}\@debug)(.|\s)*?(/{2}\@end-debug).*/

+0

Cela a fait l'affaire! Merci beaucoup. – bishboria

+1

Je vais voter, si vous indentez le bloc de code, il sera mis en surbrillance. –

0

quelle langue? Les expressions rationnelles python (je suppose qu'elles sont == à perl5 regexps) ont le concept de regexps 'gourmand' vs 'non-gourmand', vous pouvez le contrôler à travers un drapeau quelque part.

recherche « avide vs non-gourmand » sur this page, aussi this page peut-être mieux

quantificateurs gourmands ont la même syntaxe que les réguliers avides, à l'exception avec le quantificateur suivi d'un point d'interrogation. Par exemple, un motif non gourmand peut ressembler à: "/ A [A-Z] *? B /". En anglais, cela signifie "correspondre à un A, suivi de seulement autant de lettres majuscules que nécessaire pour trouver un B."

+0

aussi, ce mec est votre ami: http://www.regexbuddy.com/ –

1

Vous ne devriez pas avoir pour utiliser ce hack, soit (.|\s), mais la syntaxe pour le faire correctement dépend de la langue ou de l'outil que vous utilisez. En Perl ou Javascript, vous pouvez le faire:

/\/\/@debug.*?^\/\/@end-debug[^\r\n]*/sg 

Le modificateur /s permet le match dot-retours chariot et sauts de ligne, ce qui entraîne une expression régulière qui est à la fois plus facile à lire et plus efficace. Cela signifie également que je devais changer le deuxième .* en [^\r\n]*, mais ça vaut le coup. Le modificateur /g permet à l'expression régulière de correspondre plusieurs fois (c'est-à-dire, "globalement").

Questions connexes