2015-06-17 74 views
1

我在一個項目中有很多java文件,並且有幾個循環是空的,並且有很少的循環裏面有一些邏輯。我需要找到沒有任何邏輯的循環。AWK正則表達式來尋找特定模式

例如:命名此文件作爲Test.java

public class Test { 
    public static void main(String args[]) { 
    int x = 10; 
    while(x < 5) { 
    } 

    while(x < 20) { 
    System.out.print("value of x : " + x); 
    x++; 
    System.out.print("\n"); 
} 
} 
} 

現在會有很多其他的java文件就是這樣,在那裏while循環會一直使用。我需要找到所有沒有任何邏輯的while循環的文件。所以我需要編寫一個模式,在這裏我可以找到所有while循環的出現,這些循環在{{}括號之間沒有任何邏輯或任何內容。

如果我們把這個文件(Test.java),那麼我應該得到的輸出爲:

while (x <5) 
    { 

    } 

的文件名和行號。由於會有很多文件需要引用,因此我需要文件名和發生這種事件的行號。

希望我很清楚我的問題。

請幫忙。

+0

你可以在非空while循環中有一個空的while循環嗎?如果是這樣,那麼請確保您發佈的期望輸出正是您所需要的結果 - 不要顯示輸入文件中並不存在的代碼,並用文件名和行號說出。 –

+0

沒有在那裏不會是空的,而是在一個非空的while循環內循環。它將永遠是獨立的。我的意思是while循環爲空而while循環爲非空。我的預期輸出將是讓空循環(while沒有任何邏輯的循環)。 – DonRaHulk

回答

1

不要使用範圍表達式,因爲它們使得簡單的任務變得非常簡短,但需要一個完整的重寫或重複條件來處理即使是最輕微的需求變更,就像剛發現的那樣。總是設置/測試一個標誌。

如果沒有該語言的語法分析器,您無法穩健地完成這項工作,例如如果有人發表評論或字符串或if { ... }或其他任何內容,甚至在您填充的while循環內有點有趣,您會怎麼做?

您也沒有提供任何實際的樣本輸入/輸出來測試解決方案,也沒有告訴我們當您找到您要查找的內容時想要執行的操作 - 將其打印出來?去掉它?別的東西?

說了這一切,這便宜歡快的「解決方案」可能是不夠好,你的需求:

awk ' 
inWhile && /}/ { 
    if (!gotStuff) { 
     print "Empty loop ended at line", NR 
    } 
    inWhile=0 
} 
inWhile && NF { gotStuff=1 } 
/while\s*\([^)]*\)\s*{/ { inWhile=1; gotStuff=0 } 
' file 

上述用途\s簡寫[[:space:]],只是不,如果你的AWK使用速記不支持它(GNU awk)。

如果上述內容不夠充分,請編輯您的問題以提供一些具體的,可測試的,樣本輸入和預期輸出。

+0

您好我想打印output.For例如考慮有一個java項目,並有100個java文件,並在這些文件中,我想找到while循環沒有任何條件,while循環有條件。例如:public class Test public static void main(String args []){ int x = 10;同時(x <5){0} {0} {0}print(「x的值:」+ x); x ++; }} }從這個例子我想採取沒有任何邏輯的while循環。我的o/p應該只有這個:while(x <5){} – DonRaHulk

+0

再次 - 編輯你的問題。顯示你想如何'while(1){if(x){foo(); }}''處理以及不同的空白(例如'while(){'to'}'在一行中對所有行進行處理,如果可能的話,在註釋和/或字符串中顯示'}'。一個真實代表你真實世界代碼的簡單例子。 –