使用regexp搜索不受保护的记录器

时间:2012-04-30 09:55:58

标签: java regex eclipse

我有一个非常大的项目,其中一位同事使用了记录器,但忘记在调用记录器之前输入“is-loggable”测试,如您所知,在日志消息中使用字符串连接时可能会非常低效。但是,一些记录器已得到适当保护。

我正在寻找一个可以在Eclipse中使用的正则表达式来搜索所有那些不受保护的记录器调用,但我找不到具有负面lookbehind的正确正则表达式。

以下是一些使这个更清晰的样本:

我想匹配这个:

logger.fine("Exception raised: " + 
    e.getClass().getName() + ". See console for details.");

我不想与此相符:

if (logger.isLoggable(Level.FINE)) {
    logger.fine("Exception raised: " + 
        e.getClass().getName() + ". See console for details.");
}

也不是:

if (logger.isLoggable(Level.FINE)) 
    logger.fine("Exception raised: " + 
        e.getClass().getName() + ". See console for details.");

我不关心匹配消息内容或记录器方法调用之后的任何内容(severe(),warning(),...),我只需要logger.fine部分。

到目前为止,我已经使用了这个正则表达式: ((?<!if\s?.?logger\.isLoggable.?Level.{0,20})logger.(severe|warning|info|fine|finer|finest))但它匹配我不想匹配的内容。关于如何解决这个问题的任何想法?

代码已格式化(缩进是通过选项卡完成的),这意味着我们可以对我们的期望非常严格。

1 个答案:

答案 0 :(得分:1)

尝试一下:

(?<!if\s?\(logger\.isLoggable[^\n]{0,20}\n\s{0,20})logger\.fine

说明:

(?<!         # open negative lookbehind
if\s?\(logger\.isLoggable  # look for your if statement
[^\n]{0,20}  # then gobble up a bunch of characters ...
\n           # ... up to the end of the line
\s{0,20}     # optional whitespace at the beginning of the next line
)            # close the look behind
logger\.fine # now, is logger.fine there?