2008-10-27 32 views
7

Tôi đang cố gắng thực hiện tìm kiếm trong không gian làm việc Eclipse (Java) của tôi để tìm tất cả các biến tĩnh không phải là cuối cùng.Regex để tìm biến tĩnh (không cuối cùng)

Tôi đã thử các regex khác nhau nhưng chúng không dẫn đến bất kỳ kết quả trùng khớp nào. Ai đó có thể đề xuất một regex phù hợp với tất cả các dòng có chứa static và không chứa final và không kết thúc bằng một số { không?

Phần cuối cùng không kết thúc bằng { sẽ loại bỏ các phương pháp tĩnh.

Một ví dụ:

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

    } 
} 

Trả lời

7

mô hình này hoạt động:

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

Dưới đây là một thử nghiệm:

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

(. Tôi nhận ra rằng private static x = "3"; không phải là cú pháp hợp lệ, nhưng các mô hình vẫn giữ ok)

Mẫu mô hình thực tế là final có thể xuất hiện trước hoặc sau static với [^(final)] static [^(final)]. Phần còn lại của mẫu, [^(\})]*$, có nghĩa là ngăn bất kỳ ký tự nào { xuất hiện trong phần còn lại của dòng.

mô hình này sẽ không làm việc tuy nhiên nếu có ai thích viết báo cáo phương pháp của họ như thế này:

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

Eclipse nên có một số loại tìm kiếm Java tích hợp, nơi bạn có thể xác định rằng ... khác, thay vì viết một regexp quái vật lớn, hãy thử chaining được kết hợp một loạt các greps :

grep -r static . | grep -v final

vào báo cáo kết 1, các -r làm cho grep để recurse trên một cây thư mục bắt đầu từ thư mục địa phương, kết quả nhận được bằng đường ống đến grep 2nd mà loại bỏ tất cả các final. Tiếp tục thêm -v cho đến khi mọi thứ thừa được loại bỏ khỏi kết quả. Điều này thường dễ dàng hơn - mặc dù ít thanh lịch hơn là tìm ra một regexp phức tạp để chăm sóc mọi thứ.

+0

Có điều này quá có thể làm việc, tuy nhiên tôi đã không thể tìm kiếm chuỗi từ Eclipse. Có lẽ tôi có thể thử chạy điều này từ dấu nhắc lệnh CygWin. - Cảm ơn Parag – user31837

+0

-1 vì công cụ điều khiển rất tuyệt, nhưng giải pháp tích hợp là các câu trả lời được yêu cầu tại đây. –

2

FindBugs sẽ tìm biến tĩnh không cuối cùng cho bạn. (Cùng với nhiều điều thú vị khác.) Tôi đã có kết quả tốt với việc sử dụng phiên bản độc lập. Ngoài ra còn có một plugin Eclipse, nhưng tôi đã không sử dụng nó.

+0

Có FindBugs là một công cụ rất tốt. Tôi sử dụng nó là plugin Eclipse, nhưng nó không phát hiện tất cả các cá thể của thuộc tính tĩnh (không phải cuối cùng). Chi tiết khác trong nhận xét đã chỉnh sửa của bạn ... – user31837

+0

Hmmm, tôi không thể chỉnh sửa câu trả lời. FindBugs không gắn cờ các thuộc tính tĩnh trong các lớp bên trong tĩnh. – user31837

+0

Đôi khi FindBugs không báo cáo tất cả các thuộc tính tĩnh trong một lớp. Tôi có một lớp học với các thuộc tính tĩnh sau đây: public static int READ_ONLY = 0; public static int READ = 1; public static int WRITE = 2; FindBugs chỉ báo cáo thuộc tính thứ hai và thứ ba chứ không phải là thuộc tính đầu tiên. – user31837

0

Một trong những mã thanh tra IntelliJ đã thực hiện điều này. Bạn thực sự có thể chạy trình kiểm tra mã độc lập nếu bạn muốn và có nó tạo ra một báo cáo (hữu ích cho việc xây dựng hàng đêm).

Như các poster trước cho biết, Tìm lỗi sẽ làm điều này và tôi tưởng tượng các công cụ kiểm tra mã khác sẽ làm điều đó là tốt. Có lẽ bạn nên tích hợp một trong những công cụ kiểm tra mã hoàn chỉnh hơn là một tập lệnh một lần chỉ cho một điều này.

3

Thay vì kiểm tra cho sự vắng mặt của một cú đúp, tôi sẽ tìm kiếm một dấu chấm phẩy ở cuối:

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

Điều này cũng phù hợp với nhập khẩu tĩnh. – Jeff

+0

@ Jeff: Vâng, nhập tĩnh không tồn tại khi câu trả lời này được viết; đã sửa. –

0

Đây không phải là một regex, nhưng đây là một plugin gọi checkstyle rằng sẽ làm điều đó cho bạn, cũng như nhiều kiểm tra nguồn khác. Nó thậm chí còn sửa chữa nhiều vấn đề nó tìm thấy tự động.

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

3

Cải thiện mô hình từ @ mờ-b

[^(final|import)] static [^(final|class|{|enum)][^(\})]*$ 
Các vấn đề liên quan