我正在尝试在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() {
}
}
答案 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)
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的插件,可以为你做这个,以及许多其他源检查。它甚至可以自动解决许多问题。