2010-09-30 24 views
0

J'ai une application avec un grand nombre de blocs de débogage #if qui regarde un peu comme le celui ci-dessous:regex pour tirer des chaînes à l'intérieur #if debug #endif bloquer

#if DEBUG 
       Console.ForegroundColor = ConsoleColor.DarkCyan; 
       Console.WriteLine("oldXml: " + oldXml.OuterXml); 
          Logging.Log("XmlDiff: " + diff_sb.ToString()); 
       Console.ForegroundColor = ConsoleColor.Cyan; 
          Logging.Log("2XmlDiff: " + diff_sb.ToString()); 
       Console.WriteLine("newXml: " + newXml.OuterXml); 
       Console.ForegroundColor = ConsoleColor.Green; 
#endif 

J'utilise la recherche de ReSharper fonction de correspondance de modèle et je dois être capable de trouver toutes les instances de la chaîne "Logging.Log" à l'intérieur de ces blocs de débogage si

Quelqu'un pourrait savoir ce que l'expression rationnelle pour cette recherche de modèle devrait être?

Répondre

0

Probablement l'un des moyens les plus faciles de le faire est en deux étapes. D'abord, utilisez une regex pour collecter tous les blocs de texte entre #if DEBUG et #endif. Parcourez ensuite chacun de ces blocs et trouvez la chaîne "Logging.Log".

Si vous souhaitez conserver la position exacte, vous devez enregistrer le décalage pour chaque tronçon dans la première étape et ajouter les décalages dans la deuxième étape.

0
(?<=#if DEBUG(?:(?!#endif\b).)*)Logging\.Log[^\r\n]*(?=.*#endif) 

correspondra Logging.Log et tout le reste suit sur cette ligne que si elle est entre #if DEBUG et #endif. Notez que vous devez utiliser RegexOptions.Singleline pour que cela fonctionne. Cette regex repose sur une fonctionnalité que seuls quelques moteurs regex ont, à savoir la répétition infinie à l'intérieur lookbehind assertions. Heureusement, .NET est parmi ceux-là.

En C#:

StringCollection resultList = new StringCollection(); 
Regex regexObj = new Regex(@"(?<=#if DEBUG(?:(?!#endif\b).)*)Logging\.Log[^\r\n]*(?=.*#endif)", RegexOptions.Singleline); 
Match matchResult = regexObj.Match(subjectString); 
while (matchResult.Success) { 
    resultList.Add(matchResult.Value); 
    matchResult = matchResult.NextMatch(); 
} 

Explication:

# from the current position, look behind in the string to check... 
(?<=   # whether it is possible to match... 
#if DEBUG  # the literal text # if DEBUG 
(?:   # followed by... 
    (?!#endif\b) # (as long as we can't match #endif along the way) 
    .   # any character 
)*   # any number of times 
)    # end of lookbehind assertion. 
Logging\.Log # Then match Logging.Log, 
[^\r\n]*  # followed by any character(s) except newlines. 
(?=   # as long as there is (further up ahead)... 
.*#endif  # any number of characters, followed by #endif 
)    # end of lookahead 

Si vous êtes sûr que chaque #if DEBUG se termine par un #endif, alors vous pouvez laisser tomber le (?=.*#endif).