Intellij Idea 正则表达式查找不包含捕获组的行

yxyvkwin  于 2024-01-05  发布在  其他
关注(0)|答案(1)|浏览(199)

我试图在项目中找到错误记录throwable的日志行。正确和错误用法的示例:

  1. // Correct
  2. catch (Exception e)
  3. {
  4. Log.error(className, "something went wrong", e);
  5. }
  6. // Incorrect, exception not logged
  7. catch (Throwable t)
  8. {
  9. String errMsg = "something went wrong";
  10. Log.fatal(className, errMsg);
  11. }
  12. // Incorrect, exception name concatenated instead of providing exception to print stacktrace
  13. catch (IOException exception)
  14. {
  15. Log.error(className, "Unable to read file " + exception);
  16. }

字符串
还显示了异常类型的变体和异常变量的名称。
我目前最接近的表达式是catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*Log\s*\.\w+\(\s*\w+,[\s\S]*(?!,\b\1\b\);)\);。它匹配catch块的开头,并捕获用于保存异常的变量名,然后试图找到一个Log.<level>(行,该行 * 不 * 以异常变量作为最后一个参数结束,即, e);。它跳过上面的第一个示例,捕获其他两个。
问题:我试着在这里测试表达式https://regexr.com/7p58l,它忽略了一个重要的情况:在另一个地方日志记录是正确的,regex找不到第一个不正确的示例。

  1. catch (Exception e)
  2. {
  3. // Regex should capture here, but does not
  4. Log.error(className, "something something exception");
  5. }
  6. void someMethod() {
  7. catch (Exception e)
  8. {
  9. // Because this line hits the negative lookahead
  10. Log.error(className, "something something exception", e);
  11. }
  12. }


我所有在负先行后添加字符的尝试似乎都以某种形式破坏了它。需要添加什么才能找到所有不正确的情况?
这将被放入Intellij的全局查找中,因此如果Intellij中的工具能更好地工作,那将是非常感谢的。

rwqw0loc

rwqw0loc1#

为了实现你的目标,你可以使用一个正则表达式来确保catch块中没有正确的异常日志记录。关键是要确保如果catch块中有任何日志记录,它不会正确记录异常。下面是一个修改后的正则表达式,它应该适用于你的情况:

  1. catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*?Log\.(?!error\s*\(\s*\w+,\s*"[^"]*",\s*\1\s*\);)[^\r\n;]*;\s*[\s\S]*?\}

字符串

相关问题