正则表达式找到没有日志的catch块

时间:2013-07-10 19:23:18

标签: regex powergrep

我正在使用PowerGrep的正则表达式搜索一堆文件。我正在使用java文件,我的目标是找到块中不包含单词log的所有catch blocks,以便我可以添加日志记录。有很多文件,所以手动浏览它们并不可行。

应该的例子

catch (Exception e) {
    //comment#
    int math = 1 +2 * (3);
    String email = "email@example.com";
    anothermethod.call();
    //no logging
}  

catch(AnotherException e ) {}    //no logging

不应该的例子

catch(AnotherException e ) {  
     //some code
     log.error("Error message");
     //some more code 
}

catch(BadE_xception e) { log.error(e); }      

我对正则表达式不是很有经验,但这是我到目前为止所做的:

开始捕获块:catch\s*\(\s*\w*\s+\w*\s*\)\s*\{.*?

但是我不确定从那里开始指定不包含log。如果你有关于如何在没有正则表达式的情况下做到这一点的想法,那对我来说也是完美的。感谢

1 个答案:

答案 0 :(得分:8)

至少可以获得有限级别的嵌套案例。

对于非嵌套情况,修改表达式的结尾:

catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^}](?!\blog\b))*\}
                                ^^^^^^^^^^^^^^^^^^^^^^

让我们打破这一点。

  1. 我们严格关注非}字符;因此[^}]。找到第一个}后,我们就完成了。
  2. (?!foo)被称为否定先行断言。这意味着,“这一点后跟foo。”
  3. \b是一个词边界。 log\b周围的(?:foo)确保我们不会捕获“误报”,如“阻塞”和“逻辑”。你想要唯一的词,“log”。
  4. (foo)是一种在不捕获的情况下对表达式进行分组的方法。这并不重要 - 现在假装它与*相同。其目的是使整个组可以通过}来量化。
  5. 把它们放在一起:我们逐个字符地检查,每个log,而每个都跟着整个字,log
  6. 确保单词catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:[^{}](?!\blog\b)|\{(?:[^}](?!\blog\b))*\})*\} ^ ^======================== 在非嵌套的catch块中无处可用。

    现在,转到嵌套案例。正如@TimPietzcker指出的那样,PowerGREP还不支持递归表达式,但出于您的目的,您可能会对有限嵌套数量感到满意。这是一个嵌套级别的表达式:

    {

    我们已将|字符添加到我们不喜欢的字符类中。这是因为如果我们遇到这个角色,我们希望通过交替(=)切换到嵌套的情况,正如您通过比较catch\s*\(\s*\w*\s+\w*\s*\)\s*\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED|\{(?:SEED)*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\} 符号下划线部分所看到的那样,这是精确的原始“内在”表达的副本。您可以根据需要继续以这种方式嵌套,以捕获任意数量的平衡嵌套。


    这是10个嵌套级别的模板,对于大多数此类应用程序来说应该足够了。

    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))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\} 。我用这种方式编写它,因此在视觉上更容易删除或根据需要添加递归。扩大了,上面变成了:

    {{1}}