Comment puis-je récupérer toutes les lignes d'un document contenant "strA", mais pas "strB", dans la boîte de recherche Visual Studio?Regex: Comment récupérer toutes les lignes contenant strA mais pas strB dans Visual Studio
Répondre
Vous utiliseriez Negative lookarounds mais l'expression est très complexe si vous ne connaissez pas la position attendue (ou même l'ordre) des termes. Faire vous connaissez la commande ou le modèle?
Sinon, je vous conseille d'utiliser un autre outil qui pourrait tout aussi facilement en boucle (ou comp liste) par une ligne de fichiers en ligne et faire inStr ou contient ou autre simple, plus rapide , tests logiques ...
Pour Visual studio 2012 (et versions plus récentes):
^(?!.*strB).*strA.*$
Explication:
^ # Anchor the search at the start of the line
(?!.*strB) # Make sure that strB isn't on the current line
.*strA.* # Match the entire line if it contains strA
$ # Anchor the search to the end of the line
Vous pouvez ajouter (?:\r\n)?
à la fin de l'expression régulière si vous souhaitez également supprimer les retours chariot/saut de ligne avec le reste de la ligne.
Cela a fonctionné. J'ai dû étendre pour soutenir plusieurs chaînes pour l'exclusion, qui a fonctionné pour être par ex. '^ (?!. * strB) (?!. * strC) (?!. * strD). * strA. * $'. – DuckMaestro
Je vais supposer que le champ de recherche accepte réellement les expressions régulières générales. L'utilisation négative préanalyse:
(?!^.*strB.*$)strA
Vous devrez définir les options multilignes (^
et $
match au début/fin de lignes). Si vous ne pouvez pas le définir en utilisant les options de la boîte de dialogue, essayez:
(?m)(?!^.*strB.*$)strA
Ceci est probablement le mode par défaut dans ce moteur.
Vous devez ancrer l'ensemble de la regex, pas seulement l'apparence. Cela veut dire mettre le '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Mais il n'est pas nécessaire d'ancrer une partie de l'expression rationnelle à la * fin * de la ligne (c'est-à-dire que le '. * $' Peut aller). –
Eh bien, je ne sais pas. Comme je le regarde maintenant je l'ai écrit comme "si une ligne ne contient pas strB, match strA". Cela me semble toujours correct, puisque nous correspondons ligne par ligne. Je pense. Lire de vieilles expressions régulières me fait mal au cerveau. – wds
Pour Visual Studio 2010 (et versions antérieures):
La zone de recherche Visual Studio a sa propre version de la syntaxe bizarre regex. Cette expression fonctionne comme demandé:
^~(.*strB).*strA
^
correspond au début d'une ligne. (En général pour un éditeur de texte, il n'y a pas d'option « multilignes ». ^
et $
correspondent toujours aux limites de la ligne)
.
correspond à tout caractère sauf un saut de ligne. (Pas si typiquement, il ne semble y avoir aucun mode "ligne unique" ou "point-tout" qui permette aux points de correspondre aux nouvelles lignes.)
~(...)
est la construction "empêcher match", pour autant que je sache) à l'aperçu négatif ((?!...)
) utilisé par les autres répondeurs.
FYI, à partir de Visual Studio 2012, le moteur de regex dotNet est maintenant utilisé pour les recherches, d'où la syntaxe bizarre devrait maintenant être parti. Bonne réponse, mais sachez quelle version de VS vous utilisez. – redcalx
Test dans Visual Studio 2010 SP1Rel, cette réponse doit être modifiée si "strB" peut être APRÈS "strA". Essayez '^ ~ (. * StrB). * StrA ~ (. * StrB)'. Ou '~ (strB). * StrA. * ~ (StrB)'. – ToolmakerSteve
Cela a fonctionné pour moi avec Visual Studio 2010:.
^+ [^ (strB)] + (STRA) + [^ (strB)] + $
Ce que tu fais à... une ligne de commande, ou dans un code? Quel OS ou quelle langue? –
Dans la zone de recherche du studio visuel. – Ricky