正则表达式找到静态(非最终)变量

时间:2008-10-27 17:08:24

标签: java regex eclipse

我正在尝试在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 个答案:

答案 0 :(得分:8)

此模式有效:

[^(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!
}

答案 1 :(得分:3)

Eclipse应该内置一些Java搜索,你可以在其中指定...但是,不要写一个大的怪物正则表达式,尝试将一堆greps链接在一起:

grep -r static . | grep -v final

在第一个语句中,-r导致grep从本地目录开始递归目录树,结果通过管道传递给第二个grep,删除所有 final的。继续添加-v,直到从结果中删除所有多余的东西。这通常更容易 - 虽然不那么优雅 - 而不是找出复杂的正则表达式来处理所有事情。

答案 2 :(得分:3)

我会在最后找一个分号,而不是检查没有支架:

^(?![ \t]*import\b)(?!.*\bfinal\b).*\bstatic\b.*;[ \t]*$

答案 3 :(得分:3)

来自@ matt-b的改进模式

[^(final|import)] static [^(final|class|{|enum)][^(\})]*$

答案 4 :(得分:2)

FindBugs会为您找到静态非最终变量。 (以及许多其他有趣的事情。)我使用独立版本取得了不错的成绩。还有一个Eclipse插件,但我没有使用它。

答案 5 :(得分:0)

其中一个IntelliJ代码检查已经执行此操作。如果需要,您可以实际运行代码检查器,并生成报告(对于每晚构建很有用)。

正如之前的海报所说,Find Bugs会这样做,我想其他代码检查工具也会这样做。你可能最好整合一个更完整的代码检查工具,而不仅仅是为了这一件事的一次性脚本。

答案 6 :(得分:0)

这不是一个正则表达式,但这里有一个名为checkstyle的插件,可以为你做这个,以及许多其他源检查。它甚至可以自动解决许多问题。

http://eclipse-cs.sourceforge.net/update/