该贴跟下面的贴相关http://community.csdn.net/Expert/topic/4443/4443414.xml?temp=.189892

解决方案 »

  1.   

    随便问一下sswater(光杆兵):我在eclipse或myeclipce中执行多文件查找(?<!\)\s{0,1000})log\.debug(?![^{]*\})
    时,查找结果不正确,但在单文件中查找正确,不过有点慢,你那有这个问题没有?
      

  2.   

    我后来想起来了,我这个写法在 rambostar 兄 给出的:         if (log.isDebugEnabled())
                     {
                 log.debug("********** :");
                     }         if (log.isDebugEnabled())
                 log.debug("********** :");
             
             if (log.isDebugEnabled())  log.debug("********** :");
             
             log.debug("********** :");//只有这句是我要查找的
             
             //log.debug("********** :");      if (log.isDebugEnabled())
            {
                log.debug("ReportClientDocument initialization finished.");
                log.debug("ReportHandler.initialize() End.");
            }
    这段例子代码中是没问题的,但是放到具体程序中好像不行。我的思路是这样的:
        既然楼主要求前面不能有 "{" ,那么 log.debug 后边也不能有 "}"(但是后边可以是{}对)因此, rambostar 兄 给出的这段例子是可以的。但是放入了程序中的时候,后边不可能没有 "}",因此放入程序中不行。 rambostar 兄 的后来这个要求的确不好办,我最后给出的那个表达式也只适合 rambostar 兄 举出的例子。如果有更好的解决办法,我再继续跟贴。
      

  3.   

    谢谢sswater(光杆兵) 兄啊,解决问题后,我还要开个新帖,这样才对得住sswater(光杆兵)的才智慧啊!
      

  4.   

    我看了http://www.regexlab.com/zh/regref.htm,但还是对log\.debug(?![^{]*\})理解不深刻,(?![^{]*\})应该表示后面不存在[^{]*\}的代码,不明白为什么需要[^{]*,而[^#]*就不行,请sswater(光杆兵)兄能否详细解释一下。
      

  5.   

    我后来得到表达式为:
    (?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\})---------------------------------------------------------
    说明:(?![^{]\})根据后边是否有 "}" 来决定是否要过滤掉当前的 "log.debug"。如果后边 "}" 之前还有 "{",那么这个 "log.debug" 仍然要匹配。就是说
    log.debug....; // 这个 log.debug 的后边有 "}",但中间还有 "{",因此,这个是要匹配
    {
        log.debug...; // 这个 log.debug 不匹配,过滤掉。
    }因此:"[^{]*\}" 可以,而 "[^#]*}" 不可以。------------------------------------------------------------------
    我昨天所说的 "具体程序中好像不行" 是说:光凭后边是否有 "}" 来决定是不正确的。因为在具体程序中,肯定是这样的:
    public class xxx
    {
        public void xxxfun()
        {
            log.debug(...); // 后边有 "}",但是并不是 isDebugEnabled 的 "}"
        }
    }-------------------------------------------------------------
    我最后给出的这个表达式,除了判断是否有 "}" 外,还要判断这个 "}" 是否是 isDebugEnabled 的 "}",因此这个表达式在下边的代码中可以正确public class xxx
    {
        public void xxxfun()
        {
            log.debug() // 这样会被匹配        if(isDebugEnabled())
                log.debug() // 不会        if(log.isDebugEnabled())
            {
                log.debug() // 不会
                log.debug() // 不会
            }        log.debug(...); // 会        if(log.otherfun())
            {
                log.debug(...) // 会
            }
        }
    }-------------------------------------------
    另外,为了不让这个表达式过于复杂:(1) 没有考虑
    if(log.isDebugEnabled())
    {
        {
            log.debug() // 双重括号仍然会被匹配,否则太复杂
        }
    }(2) 没有考虑 log.debug("....{....}....") 信息中有大括号
    信息中有大括号的话,会影响判断。如果这些特性要求支持的话,那么这个表达式就太复杂了。
      

  6.   

    重复一次强调,我最后得到表达式为:
    (?<!\)\s{0,500})log\.debug(?![^{}]*(?<=isDebugEnabled\(\)\)\s{0,200}\{[^{}]{0,500})\})
      

  7.   

    广告:我前面所写的表达式,虽然看起来复杂,其实用到的思路和方法都是一些基本的用法。看别人写的表达式就像看汇编语言似的,很不容易看清。关键是要掌握好常用的基础和理清楚思路。推荐:推荐大家访问我写的入门文章,里面讲解了我这里用到的方法:
    http://www.regexlab.com/zh/regref.htm
      

  8.   

    我会再开一个新帖请sswater(光杆兵)接分,顺便继续请教sswater(光杆兵)兄一些正则表达式问题!
      

  9.   

    谢谢sswater(光杆兵),你的入门文章写得真好,我会继续请教你一些问题,我会短消息给你,请留意,同时也避免倒分的嫌疑。