正则表达式。从For循环块中删除代码语句

时间:2013-01-21 07:51:52

标签: regex notepad++ replace

从for循环块中删除代码语句......

  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 );
     }

我想从for循环块中删除logger.info语句。这可能吗?

我已经使用了表达式

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

从Notepad ++中的if语句中删除它们。我正在寻找一种从 for

中移除的方法

更新:如果有可能,请使用python脚本帮助我。

2 个答案:

答案 0 :(得分: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)
    }

现在尝试跟踪嵌套...

答案 1 :(得分: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元素中的其他查询。所有其他步骤都是一样的。