0

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

我正在寻找可以在 Eclipse 中使用的正则表达式来搜索所有那些未受保护的记录器调用,但我找不到正确的正则表达式,并带有否定的后视功能。

这里有一些示例可以使这一点更清楚:

我想匹配这个:

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))但它匹配我不想匹配的东西。关于如何解决这个问题的任何想法?

代码是格式化的(缩进是用制表符完成的),这意味着我们可以对我们的期望非常严格。

4

1 回答 1

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?
于 2012-04-30T10:31:30.033 回答