Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex查找不带日志的catch块_Regex_Powergrep - Fatal编程技术网

Regex查找不带日志的catch块

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

我正在使用带有PowerGrep的正则表达式来搜索一堆文件。我正在处理java文件,我的目标是找到块中不包含单词
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专家。