Regex查找不带日志的catch块
我正在使用带有PowerGrep的正则表达式来搜索一堆文件。我正在处理java文件,我的目标是找到块中不包含单词Regex查找不带日志的catch块,regex,powergrep,Regex,Powergrep,我正在使用带有PowerGrep的正则表达式来搜索一堆文件。我正在处理java文件,我的目标是找到块中不包含单词log的所有catch,以便添加日志记录。有很多文件,所以手动浏览它们是不可行的 应找到的示例 catch (Exception e) { //comment# int math = 1 +2 * (3); String email = "email@example.com"; anothermethod.call(); //no logging
log
的所有catch,以便添加日志记录。有很多文件,所以手动浏览它们是不可行的
应找到的示例
catch (Exception e) {
//comment#
int math = 1 +2 * (3);
String email = "email@example.com";
anothermethod.call();
//no logging
}
catch(AnotherException e ) {
//some code
log.error("Error message");
//some more code
}
及
不应找到的示例
catch (Exception e) {
//comment#
int math = 1 +2 * (3);
String email = "email@example.com";
anothermethod.call();
//no logging
}
catch(AnotherException e ) {
//some code
log.error("Error message");
//some more code
}
及
我对正则表达式不是很有经验,但到目前为止,我的经验是:
catch块的开始:catch\s*\(\s*\w*\s+\w*\s*\)\s*\{.*?
但是,我不确定从哪里开始指定not contain
log
。如果您有关于如何在没有正则表达式的情况下实现这一点的想法,那么这对我来说也非常适合。谢谢您,至少可以获得有限级别的嵌套案例
对于无嵌套的情况,修改表达式的结尾:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\}
^^^^^^^^^^^^^^^^^^^^^^
让我们来分析一下
[^}]
。一旦我们找到第一个}
,我们就完成了(?!foo)
被称为负前瞻断言。它的意思是,“这一点后面没有foo
”\b
是单词边界。在\b
s中围绕log
可以确保我们不会捕捉到诸如“阻塞”和“逻辑”之类的“误报”。你只需要一个词“log”(?:foo)
是一种将表达式分组而不捕获的方法。现在这并不重要,假装它与(foo)
相同。其目的是通过*
对整个群体进行量化}
,每个字符后面都不是整个单词log
log
不在非嵌套catch块中
现在,进入嵌套案例。正如@TimPietzcker所指出的,PowerGREP还不支持递归表达式,但是出于您的目的,您可能会对有限数量的嵌套感到满意。下面是一个嵌套级别的表达式:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\}
^ ^========================
我们已将{
字符添加到我们不喜欢的字符类中。这是因为如果遇到此字符,我们希望通过交替(|
)切换到嵌套的大小写,通过比较=
符号下划线的部分可以看出,它是原始“内部”的精确副本您可以继续以这种方式嵌套,以捕获任意数量的平衡嵌套
下面是10个嵌套级别的模板,对于大多数此类应用程序来说应该足够了
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
其中,SEED
是递归种子,[^{}](?!\blog\b)
。我是这样写的,这样在视觉上更容易根据需要删除或添加递归。展开后,上述内容变为:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b)|\{(?:[^{}](?!\blog\b))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
在
catch
块中可能有嵌套的大括号,对吗?PowerGREP的正则表达式引擎还不能处理递归(现在).是的,有这样的情况。因为日志记录不是绝对必要的,我现在愿意忽略这些,只获取非嵌套的情况。很好!非常感谢你的回答和解释。没问题。为了方便未来的观众,还编辑了10个嵌套级别的表达式。不适用于声明的异常最后,如前所述,需要进行一些调整。我自己在catch-open括号后添加了一个\s*\w*,但我不是regexp专家。