Expressions régulières multi-lignes dans Visual Studio

Existe-t-il un moyen de faire en sorte que Visual Studio effectue un remplacement de regex sur plusieurs lignes (laissez la correspondance traverser les limites des lignes)? Je sais qu’il existe de nombreux éditeurs que je peux utiliser pour cela, mais il semble étrange que cette fonctionnalité ait été exclue de Visual Studio. Est-ce que je manque quelque chose?

Utilisez la boîte de dialog Remplacer dans les fichiers CtrlShiftH et l’option de ligne unique (?s) :

 (?s)start.*end 

trouve

 start two three end 

Singleline signifie: chaque fichier est traité comme une seule ligne, point . correspond à newline \n . Inconvénient: vous devez utiliser Rechercher tout et remplacer tout ou remplacer à la main. Find next ne fonctionne pas.

Pour la boîte de dialog non modale CtrlH et rechercher ensuite, utilisez (.*\n)* pour faire correspondre un nombre quelconque de lignes:

 start(.*\n)*.*end 

De toute façon, vous pouvez remplacer vos résultats par plusieurs lignes en insérant \n .

Les expressions régulières ont été modifiées dans Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Pour faire correspondre une expression sur deux lignes, le code serait désormais:

StartOfExpression.*\r?\n.*EndOfExpression

Cela fonctionne aujourd’hui dans Visual Studio 2012:

 fooPatternToStart.*(.*\n)+?.*barPatternToEnd 

Voir comment le (.*\n)+? la partie fait le match sur plusieurs lignes, non gourmandes.
fooPatternToStart est un modèle de regex sur votre ligne de départ, alors que barPatternToEnd est votre modèle pour trouver sur une autre ligne ci-dessous, peut-être plusieurs lignes ci-dessous …

Exemple trouvé ici .

Simple et efficace 🙂

Remarque: avant VS2012, le modèle fooPatternToStart. (. \n)+@.*barPatternToEnd était: fooPatternToStart. (. \n)+@.*barPatternToEnd fooPatternToStart. (. \n)+@.*barPatternToEnd

Remarque: cette réponse utilise la syntaxe regex utilisée dans Visual Studio jusqu’à VS 2012 inclus. Dans VS 2013 et versions ultérieures, la syntaxe regex a été modifiée.

Vous pouvez inclure \n dans l’expression. Par exemple, voici une regex que j’utilise pour “nettoyer” les scripts SQL générés automatiquement à partir de tout ce qui n’est pas une procédure stockée (elle correspondra aux blocs de texte commençant par une ligne contenant “Object:” suivie de quelque chose qui n’est pas “StoredProcedure”, puis faire correspondre les lignes suivantes à une ligne se compose du mot “GO”:

 /\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n 

vous devrez peut-être utiliser \ r \ n à la fin de votre expression.