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

我正在尝试在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() { } } 

这种模式有效:

 [^(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可以在[^(final)] static [^(final)]之前或之后出现的事实。 模式的其余部分[^(\})]*$旨在防止任何{字符出现在行的其余部分中。

如果有人喜欢这样编写方法语句,这种模式将无法工作:

 private static void blah() { //hi! } 

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

grep -r static . | grep -v final

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

来自@ matt-b的改进模式

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

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

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

FindBugs会为您找到静态非最终变量。 (以及许多其他有趣的东西。)我使用独立版本取得了很好的效果。 还有一个Eclipse插件,但我没有使用它。

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

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

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

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