我有一个非常大的项目,其中一位同事使用了记录器,但忘记在调用记录器之前输入“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))
但它匹配我不想匹配的内容。关于如何解决这个问题的任何想法?
代码已格式化(缩进是通过选项卡完成的),这意味着我们可以对我们的期望非常严格。
答案 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?