2013-07-10 2 views
6

Я использую regex с PowerGrep для поиска через кучу файлов. Я работаю с java-файлами, и моя цель - найти все catch blocks, которые не содержат слова log внутри блока, чтобы я мог добавлять журналы. Есть много файлов, поэтому прохождение их вручную не реально.Regex найти блоки catch без журнала

Примеры того, что должны быть найдены

catch (Exception e) { 
    //comment# 
    int math = 1 +2 * (3); 
    String email = "[email protected]"; 
    anothermethod.call(); 
    //no logging 
} 

и

catch(AnotherException e) {} //no logging 

Примеры того, что НЕ должны быть найдены

catch(AnotherException e) { 
    //some code 
    log.error("Error message"); 
    //some more code 
} 

и

catch(BadE_xception e) { log.error(e); }  

Я не очень опытный с регулярным выражением, но это то, что я до сих пор:

начало поймать блока: catch\s*\(\s*\w*\s+\w*\s*\)\s*\{.*?

, но тогда я не знаю, куда идти оттуда укажите не содержать log. Если у вас есть идеи о том, как это сделать без регулярного выражения, это отлично работает и для меня. Спасибо

+0

Возможно, в блоках 'catch' могут находиться вложенные фигурные скобки, верно? Ядро PowerGREP не может обрабатывать рекурсию (пока). –

+0

Да, есть такие случаи. Поскольку регистрация не является абсолютно необходимой, я готов упустить их прямо сейчас и просто получить не-вложенные случаи. – jlars62

ответ

8

Вы можете получить конечный уровень вложенных случаев, по крайней мере.

Для не-вложенной случае изменения конца своего выражения:

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\} 
           ^^^^^^^^^^^^^^^^^^^^^^ 

Давайте разберем это вниз.

  1. Мы строго смотрим на символы не }; следовательно, [^}]. Как только мы найдем первый }, мы закончили.
  2. (?!foo) называется отрицательное утверждение lookahead. Это означает: «Эта точка не, а затем foo».
  3. \b - это граница слова. Окружающий log в \b s гарантирует, что мы не поймаем «ложные срабатывания», такие как «засорить» и «логично». Вы хотите единственное слово «log».
  4. (?:foo) - способ группировки выражения без захвата. Это не важно — на данный момент притворяться, что это то же самое, что и (foo). Его цель состоит в том, чтобы всю группу можно было количественно определить *.
  5. Собираем все вместе: мы проверяем посимвольно, каждый из которых не будучи }, и каждый из них не соблюдаются по целому слову, log.

Это гарантирует, что слово log нигде не находится внутри неблокированного блока catch.

Теперь, двигаясь на вложенные корпуса. Как отметил @TimPietzcker, PowerGREP пока не поддерживает рекурсивные выражения, но для ваших целей вы можете быть удовлетворены числом конечных числа гнезд. Вот выражение для уровня один вложенности:

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\} 
            ^   ^======================== 

Мы добавили { характер класса персонажей нам не нравится. Это связано с тем, что, если мы сталкиваемся с этим символом, мы хотим переключиться через чередование (|) во вложенный случай, который, как вы можете видеть, сравнивая часть, подчеркнутую знаками =, является точной копией исходного «внутреннего» выражения , Вы можете продолжать вложить этот путь столько, сколько хотите, чтобы захватить произвольное количество сбалансированных гнезд.


Вот шаблон для 10 уровней гнездования, которого должно быть достаточно для большинства приложений такого типа.

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\} 

где SEED семя рекурсии, [^{}](?!\blog\b). Я написал это так, поэтому визуально проще удалить или добавить рекурсии по желанию. Вышеуказанное становится следующим:

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\} 
+0

Красивая! Большое спасибо за ответ и объяснение. – jlars62

+1

Нет проблем. Также отредактировано в выражении для 10 уровней гнездования, для удобства будущих зрителей. –