2011-10-19 46 views
0

我試圖創建一個自定義的Checkstyle規則,當開發人員使用@Ignore而沒有評論時將標記爲錯誤。因此,我正在尋找一個正則表達式相匹配以下情形:Checkstyle的正則表達式匹配缺少@Ignore評論

@Ignore 
@Test 
public void someTest() { 
    ... 
} 

這一個:

@Ignore @Test //or @Test @Ignore 
public void someTest() { 
    ... 
} 

但是不匹配這樣的場景:

@Ignore("some comment detailing why this test was ignored") 
@Test 
public void someTest() { 
    ... 
} 

或這一個:

@Test 
public void someTest() { 
    ... 
} 

因此,基本上它的正則表達式匹配@Ignore,但只有當它存在並且只有當它沒有合格評論時,例如@Ignore("commnent here")

+0

哪個正則表達式引擎您使用的?解決方案可能會有所不同,這取決於此(正如[正則表達式標記信息](http://stackoverflow.com/tags/regex/info)中所述) –

+0

@Tim,我會認爲它是Java –

回答

1
@Ignore(?![ \t]*\() 

匹配@Ignore只有當它的後面沒有一個左括號。

說明:

@Ignore # Match "@Ignore" 
(?!  # Assert that we can't match... 
[ \t]* # optional spaces/tabs 
\(  # followed by a (at the current position 
)   # End of lookahead 

在Java:

Pattern regex = Pattern.compile("@Ignore(?![ \\t]*\\()"); 
+0

謝謝蒂姆。看起來這將適用於我上面的原始示例。但是,正如Kent指出的那樣,我忘了另一種情景(現在加入到我的問題中) –

+0

@Chris:好的,我已經重寫了我的答案。這是爲你工作嗎?具體來說,'@ Ignore'和註釋之間是否可以出現空格/製表符或其他空格? –

+0

是,它可能位於'@ Ignore'和註釋之間的空格。例如。 '@Ignore(「一些評論」)'是有效的(例如不應該匹配) –

1

,你可以試試這個:

@Ignore\s*$ 

實際上是JUnit測試,註釋:

@Test @Ignore 
public void testXXXX(){} 

也有效。所以這也需要匹配。

更新

這應該是確定:

@Ignore\s*(?!\() 
+0

謝謝肯特。我喜歡你的簡單性,只是當你有'@Ignore @Test'時它不起作用。 –

+0

看到我更新的答案 – Kent

+0

我想你正在做一些代碼審查。用IDE可能? IDE通常具有代碼格式化程序/ checkStyle功能。您可以在註釋之後定義添加新行。 (每行一個註釋),它不僅僅是針對這個問題,而且還使代碼更具可讀性。 – Kent