Regex для поиска статических (не финальных) переменных - PullRequest
7 голосов
/ 27 октября 2008

Я пытаюсь выполнить поиск в своем рабочем пространстве Eclipse (Java), чтобы найти все экземпляры статических переменных, которые не являются окончательными.

Я пробовал различные регулярные выражения, но они не приводят ни к каким совпадениям. Может кто-нибудь предложить регулярное выражение, которое будет соответствовать всем строкам, содержащим static и не содержащим final, и не заканчивающимся на {?

Последняя часть, не заканчивающаяся на {, устранит статические методы.

Пример:

public class FlagOffendingStatics {
  private static String shouldBeFlagged = "not ok";
  private static final String ok = "this is fine";
  public static void methodsAreOK() {

  }
}

Ответы [ 7 ]

8 голосов
/ 27 октября 2008

Этот шаблон работает:

[^(final)] static [^(final)][^(\})]*$

Вот тест:

$ cat test.txt
private int x = "3";
private static x = "3";
private final static String x = "3";
private static final String x = "3";
private static String x = "3";
public static void main(String args[]) {
        blah;
}

$ grep "[^(final)] static [^(final)][^(\})]*$" test.txt
private static x = "3";
private static String x = "3";

(я понимаю, что private static x = "3"; не является допустимым синтаксисом, но шаблон все еще в порядке.)

Шаблон учитывает тот факт, что final может появляться до или после static с [^(final)] static [^(final)]. Остальная часть шаблона, [^(\})]*$, предназначена для предотвращения появления любых символов { в оставшейся части строки.

Этот шаблон не будет работать, однако, если кому-то нравится писать свои выражения метода следующим образом:

private static void blah()
{
     //hi!
}
3 голосов
/ 30 мая 2014

Улучшенный шаблон от @ matt-b

[^(final|import)] static [^(final|class|{|enum)][^(\})]*$
3 голосов
/ 27 октября 2008

Вместо проверки на отсутствие скобки я бы искал точку с запятой в конце:

^(?![ \t]*import\b)(?!.*\bfinal\b).*\bstatic\b.*;[ \t]*$
3 голосов
/ 27 октября 2008

Eclipse должен иметь какой-то встроенный поиск Java, где вы можете указать это ... В противном случае, вместо написания одного большого регулярного выражения монстра, попробуйте связать воедино кучу greps:

grep -r static . | grep -v final

в первом выражении -r заставляет grep рекурсировать по дереву каталогов, начиная с локального каталога, результаты передаются по конвейеру во второй grep, который удаляет все final s. Продолжайте добавлять -v, пока все лишнее не будет удалено из результатов. Это обычно проще - хотя и не так элегантно - чем придумывать сложное регулярное выражение, чтобы позаботиться обо всем.

2 голосов
/ 27 октября 2008

FindBugs найдет статические не финальные переменные для вас. (Наряду со многими другими интересными вещами.) У меня были хорошие результаты при использовании автономной версии. Существует также плагин Eclipse, но я этим не пользовался.

0 голосов
/ 19 февраля 2009

Это не регулярное выражение, но вот плагин с именем checkstyle, который сделает это за вас, а также многие другие проверки исходного кода. Он даже исправляет многие проблемы, которые находит автоматически.

http://eclipse -cs.sourceforge.net / обновление /

0 голосов
/ 27 октября 2008

Одна из проверок кода IntelliJ уже делает это. Вы можете запустить инспектор кода автономно, если хотите, и сгенерировать отчет (полезно для ночной сборки).

Как сказал предыдущий автор, Find Bugs сделает это, и я думаю, что другие инструменты проверки кода сделают это также. Возможно, вам лучше интегрировать один из этих более полных инструментов проверки кода, а не одноразовый сценарий только для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...