Sunday, April 3, 2011

Regex to find static (non final) variables

I am trying to do a search in my Eclipse (Java) workspace to find all instances of static variables that are not final.

I tried various regex's but they do not result in any matches. Can someone suggest a regex that will match all lines containing 'static' and not containing 'final', and not ending in a '{'

The last part about not ending with a '{' will eliminate static methods.

An example

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

  }
}

-- Thanks Parag

From stackoverflow
  • Eclipse should have some sort of Java search built-in where you could specify that... Else, instead of writing one large monster regexp, try chaining together a bunch of greps:

    grep -r static . | grep -v final

    in the 1st statement, the -r causes the grep to recurse over a directory tree starting at the local directory, the results get piped to the 2nd grep which removes all the final's. Keep adding -v until everything superfluous is removed from the results. This is usually easier --albeit less elegant-- than figuring out a complicated regexp to take care of everything.

    : Yes this too might work, however I was not able to chain searches from Eclipse. Maybe I can try running this from a CygWin command prompt. -- Thanks Parag
  • Can you post a quick block of sample data for testing; I think I know what you're asking but I'm not sure.

    : I have edited the question with an example. The variable names are self explaining.
  • FindBugs will find static non-final variables for you. (Along with many other interesting things.) I've had good results with using the standalone version. There is also an Eclipse plugin, but I haven't used that.

    : Yes FindBugs is a very good tool. I use it's Eclipse plugin, but it does not detect all instances of (non final) static attributes. More details in your edited comment...
    : Hmmm, I guess answers cannot be edited. FindBugs does not flag static attributes in static inner classes.
    : Also sometimes FindBugs does not report all static attributes in a class. I have a class with the following static attributes: public static int READ_ONLY = 0; public static int READ = 1; public static int WRITE = 2; FindBugs reported only the second and third attributes and not the first one.
  • This pattern works:

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

    Here is a test:

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

    (I realize that private static x = "3"; isn't valid syntax, but the pattern still holds ok.)

    The pattern accounts for the fact that final can appear before or after static with [^(final)] static [^(final)]. The rest of the pattern, [^(\})]*$, is meant to prevent any { characters from appearing in the remainder of the line.

    This pattern will not work however if anyone likes to write their method statements like this:

    private static void blah()
    {
         //hi!
    }
    
  • One of the IntelliJ code inspections already does this. You can actually run the code inspector stand alone if you want and have it generate a report (usefull for a nightly build).

    As the previous poster said, Find Bugs will do this and I imagine other code inspection tools will do it as well. You're probably better off integrating one of those more complete code inspection tools rather than a one-off script just for this one thing.

  • Instead of checking for the absence of a brace, I would look for a semicolon at the end:

    ^(?!.*\bfinal\b).*\bstatic\b.*;[ \t]*$
    
  • This isn't a regex, but here is a plugin called checkstyle that will do that for you, as well as many other source checks. It even fixes many problems it finds automatically.

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

0 comments:

Post a Comment