2008-10-27 8 views
7

Estoy tratando de hacer una búsqueda en mi espacio de trabajo Eclipse (Java) para encontrar todas las instancias de variables estáticas que no son definitivas.Regex para encontrar variables estáticas (no finales)

Probé varias expresiones regulares, pero no dieron ninguna coincidencia. ¿Puede alguien sugerir una expresión regular que coincida con todas las líneas que contengan static y que no contenga final, y que no termine en {?

La última parte acerca de que no termina con { eliminará los métodos estáticos.

Un ejemplo:

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

    } 
} 

Respuesta

7

Este patrón funciona:

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

Aquí está una prueba:

$ 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"; 

(. Soy consciente de que private static x = "3"; no es una sintaxis válida, pero el patrón todavía mantiene bien)

El patrón explica el hecho de que final puede aparecer antes o después de static con [^(final)] static [^(final)]. El resto del patrón, [^(\})]*$, está destinado a evitar que aparezcan caracteres { en el resto de la línea.

Este patrón no funcionará sin embargo, si alguien le gusta escribir sus declaraciones de métodos como esto:

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

Eclipse debe tener algún tipo de búsqueda de Java incorporado en donde se puede especificar que ... De lo contrario, en lugar de escribir una expresión regular gran monstruo, trata de encadenar un montón de greps :

grep -r static . | grep -v final

en la primera declaración, el -r hace que el grep recursivo a lo largo de un árbol de directorios comenzando en el directorio local, los resultados se canalizan al segundo grep que elimina toda la final 's. Siga agregando -v hasta que todo lo superfluo se elimine de los resultados. Esto suele ser más fácil, menos elegante, que encontrar una expresión regular complicada para encargarse de todo.

+0

Sí esto también podría funcionar, sin embargo, no fue capaz de búsquedas cadena de Eclipse. Quizás pueda intentar ejecutar esto desde un símbolo del sistema de CygWin. - Gracias Parag – user31837

+0

-1 porque las herramientas de la consola son geniales, pero las soluciones integradas son las respuestas solicitadas aquí. –

2

FindBugs encontrará variables estáticas no finales para usted. (Junto con muchas otras cosas interesantes.) He tenido buenos resultados con el uso de la versión independiente. También hay un plugin de Eclipse, pero no lo he usado.

+0

Sí FindBugs es una muy buena herramienta. Yo uso su plugin de Eclipse, pero no detecta todas las instancias de atributos estáticos (no finales). Más detalles en su comentario editado ... – user31837

+0

Hmmm, creo que las respuestas no se pueden editar. FindBugs no marca atributos estáticos en clases internas estáticas. – user31837

+0

También a veces FindBugs no informa todos los atributos estáticos en una clase. Tengo una clase con los siguientes atributos estáticos: public static int READ_ONLY = 0; public static int READ = 1; public static int WRITE = 2; FindBugs informó solo los atributos segundo y tercero y no el primero. – user31837

0

Una de las inspecciones de código IntelliJ ya lo hace. De hecho, puede ejecutar el inspector de código solo si lo desea y hacer que genere un informe (útil para una compilación nocturna).

Como decía el cartel anterior, Find Bugs hará esto e imagino que otras herramientas de inspección de código también lo harán. Probablemente sea mejor que integre una de esas herramientas de inspección de código más completas en lugar de una secuencia de comandos única para esta única cosa.

3

En lugar de verificar la ausencia de un aparato ortopédico, me gustaría ver por un punto y coma al final:

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

Esto también coincide con las importaciones estáticas. – Jeff

+0

@Jeff: Sí, las importaciones estáticas no existían cuando se escribió esta respuesta; fijo. –

0

Ésta no es una expresión regular, pero aquí es un plugin llamado Checkstyle que lo hará por usted, así como muchos otros controles de origen. Incluso soluciona muchos problemas que encuentra automáticamente.

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

3

mejorada patrón de @ mate-b

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