我正在使用PowerGrep的正则表达式来搜索一堆文件.我正在使用java文件,我的目标是找到块中不包含单词的所有catch 块,log以便我可以添加日志记录.有很多文件,所以手动浏览它们并不可行.
应该找到什么的例子
catch (Exception e) {
//comment#
int math = 1 +2 * (3);
String email = "email@example.com";
anothermethod.call();
//no logging
}
Run Code Online (Sandbox Code Playgroud)
和
catch(AnotherException e ) {} //no logging
Run Code Online (Sandbox Code Playgroud)
不应该找到什么的例子
catch(AnotherException e ) {
//some code
log.error("Error message");
//some more code
}
Run Code Online (Sandbox Code Playgroud)
和
catch(BadE_xception e) { log.error(e); }
Run Code Online (Sandbox Code Playgroud)
我对正则表达式不是很有经验,但这是我到目前为止所拥有的:
catch块开始: catch\s*\(\s*\w*\s+\w*\s*\)\s*\{.*?
但后来我不确定从哪里开始指定不包含log.如果你有关于如何在没有正则表达式的情况下做到这一点的想法,那对我来说也是完美的.谢谢
至少可以获得有限级别的嵌套案例.
对于非嵌套情况,修改表达式的结尾:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\}
^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
让我们打破这个.
}人物角色; 因此[^}].一旦找到第一个},我们就完成了.(?!foo)称为负前瞻断言.这意味着,"这一点不会被追随foo."\b是一个词边界.log在\bs 周围确保我们不会捕获"误报",如"阻塞"和"逻辑".你想要唯一的词,"日志".(?:foo)是一种无需捕获即可对表达式进行分组的方法.这并不重要 - 现在假装它是一样的(foo).它的目的是使整个群体可以量化*.},每一个都没有被整个单词所遵循,log.这确保了单词log在非嵌套的catch块中无处可去.
现在,转到嵌套案例.正如@TimPietzcker指出的那样,PowerGREP还不支持递归表达式,但出于您的目的,您可能对有限数量的嵌套感到满意.这是一个嵌套级别的表达式:
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\}
^ ^========================
Run Code Online (Sandbox Code Playgroud)
我们已将{字符添加到我们不喜欢的字符类中.这是因为如果我们遇到这个字符,我们想通过alternation(|)切换到嵌套的情况,正如你可以通过比较=符号下划线的部分所看到的那样,它是原始"内部"表达式的精确副本.您可以根据需要继续以这种方式嵌套,以捕获任意数量的平衡嵌套.
这是10个嵌套级别的模板,对于大多数此类应用程序来说应该足够了.
catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
Run Code Online (Sandbox Code Playgroud)
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))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
Run Code Online (Sandbox Code Playgroud)