регулярное выражение для извлечения строк внутри блока #if debug #endif - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть приложение с большим количеством блоков отладки #if, которые выглядят так, как показано ниже:

#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

Я использую функцию поиска по шаблону поиска Resharper, и мне нужно иметь возможность найти все экземпляры строки "Logging.Log" внутри них, если блоки отладки

Кто-нибудь знает, каким должно быть регулярное выражение для этого поиска по шаблону?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2010
(?<=#if DEBUG(?:(?!#endif\b).)*)Logging\.Log[^\r\n]*(?=.*#endif)

будет соответствовать Logging.Log и всем остальным, что следует в этой строке, только если оно находится между #if DEBUG и #endif.Обратите внимание, что вам нужно использовать RegexOptions.Singleline, чтобы это работало.Это регулярное выражение опирается на функцию, которой обладают лишь немногие движки регулярных выражений, а именно бесконечное повторение внутри взгляда позади утверждений .К счастью, среди них есть .NET.

В 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();
} 

Объяснение:

# 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

Если вы уверены, что каждый#if DEBUG заканчивается #endif, затем вы можете сбросить (?=.*#endif).

0 голосов
/ 30 сентября 2010

Вероятно, один из самых простых способов сделать это в два этапа. Во-первых, используйте регулярное выражение, чтобы собрать все блоки текста между #if DEBUG и #endif. Затем пройдите через каждый из этих блоков и найдите строку «Logging.Log».

Если вы хотите сохранить точное положение, вам нужно сохранить смещение для каждого блока на первом шаге и добавить смещения на втором шаге.

...