6

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

应该找到的示例

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*\{.*?

但后来我不确定从那里去哪里指定 not contains log。如果您对如何在没有正则表达式的情况下执行此操作有想法,那对我来说也很完美。谢谢

4

1 回答 1

8

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

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

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

让我们分解一下。

  1. 我们正在严格查看非}字符;因此[^}]. 一旦我们找到第一个},我们就完成了。
  2. (?!foo)称为否定前瞻断言。它的意思是,“这一点后面没有foo。”
  3. 是一个词的\b边界。包围log\bs 中确保我们不会捕捉到像“阻塞”和“逻辑”这样的“误报”。你想要唯一的词,“日志”。
  4. (?:foo)是一种无需捕获即可对表达式进行分组的方法。这并不重要——现在假设它与(foo). 其目的是使整个组可以通过*.
  5. 综上所述:我们正在逐个字符地检查,每个字符都不是 a },并且每个字符后面都不是整个单词,log

这确保了单词log不在非嵌套的 catch 块中。

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

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

我们已将该角色添加{到我们不喜欢的角色类别中。这是因为如果我们遇到这个字符,我们希望通过alternation ( |) 切换到嵌套大小写,通过比较符号下划线的部分可以看出=,它是原始“内部”表达式的精确副本。您可以根据需要继续以这种方式嵌套,以捕获任意数量的平衡嵌套。


这是 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))*\})*\})*\})*\})*\})*\})*\})*\})*\})*\})*\}
于 2013-07-10T20:27:00.500 回答