2013-01-21 54 views
0

刪除代碼語句刪除代碼語句...正則表達式。從從循環塊環路結構

for(UIComponent currentMenuItemComponent : menuBarComponent.getChildren()) { 
    String style = ""; 
    String selectedViewName = (String)currentMenuItemComponent.getAttributes().get(ATTRIBUTE_View); 
    logger.info("Value of selectedViewName =" + selectedViewName); 
    if(selectedViewName.equals(targetView)) { 
     style = "selected"; 
     logger.info("Value of style =" + style); 
    } 

我想刪除從循環塊logger.info語句。這可能嗎 ?

我已經使用了表達

(if|else)(.*)(\r?\n)([\s-]*)(logger.info)(\(\")(.*)(\" \);) 

從如果在記事本++語句刪除它們。我正在尋找一種方式從卸妝爲

更新:如果可能的話用python腳本,請幫助我。

+0

那麼,如果你可以做'if'語句,'for循環'有什麼大不了的? –

+0

因爲它不在下一行......它可以在任何地方是for循環塊。 –

回答

1

這是非常相似的,你問這裏上定位System.out.println其他問題:Remove System.out statements from For Loops blocks only

參考my answer,唯一的區別是PMD查詢是不同的。這裏是新的:

//ForStatement/Statement/descendant-or-self:: 
     Statement[./StatementExpression/PrimaryExpression/PrimaryPrefix/Name[@Image="logger.info"]] 

在我的答案重新裝上<![CDATA[ ... ]]>元素的其他查詢中custom.xml。其他所有步驟都是相同的。

1

這是你不能用正則表達式做的事情,至少不能用Notepad ++的正則表達式引擎。

考慮以下幾點:

for (...) 
{ 
    foo(); 
    logger.info(baz) 
    if (bar()) 
    { 
     logger.info(spam) 
    } 
    logger.info(ham) 
} 

您將需要遞歸保持括號{...}的嵌套層次的軌道,你的計劃是目前在確定任何logger.info()是否屬於正確的塊。大多數正則表達式引擎無法處理遞歸。即使你正在使用一個可以(如.NET)的應用程序,它仍然是一場噩夢。想象一下:

for (...) 
    { 
     foo(); 
     logger.info(baz) 
//  if (bar()) 
//  { 
     if (badabing()) { 
      logger.info(spam) 
     } 
     logger.info(ham) 
    } 

現在嘗試和跟蹤築巢...