Java 查找包含{}且不';不包括某个字符串

Java 查找包含{}且不';不包括某个字符串,java,regex,Java,Regex,对于我们的代码库,我需要找到所有不打印stacktrace的catch语句 这样的一条线 catch (Exception e) { } 或 或 如果字符串“StackTrace”包含在{}之间的任何位置,则不包括 我有这个 catch\b\s*\(.*\)\s*\{.*\n*(?!stackTrace).*\n*\} 除了多条生产线外,它似乎大部分都在工作 有人能帮忙吗 谢谢 编辑:一些失败的例子。。它往往在这方面失败 } catch (NameNotFoundException e)

对于我们的代码库,我需要找到所有不打印stacktrace的catch语句

这样的一条线

catch (Exception e) { }

如果字符串“StackTrace”包含在{}之间的任何位置,则不包括

我有这个

 catch\b\s*\(.*\)\s*\{.*\n*(?!stackTrace).*\n*\}
除了多条生产线外,它似乎大部分都在工作

有人能帮忙吗

谢谢

编辑:一些失败的例子。。它往往在这方面失败

} catch (NameNotFoundException e) {

    }
这是有效的

} catch (JSONException e) {
        }
这是我给你的正则表达式(有点难看——但它能用!欢迎任何改进)


我将使用正则表达式查找每个
catch(…)
,然后逐行向下扫描,计算打开/关闭的大括号,直到catch块结束。在扫描的每一行使用正则表达式检查“StatckTrace”。

若要进行自动代码检查,应查看PMD和checkstyle

事实上,PMD已经为“EmptyCatchBlock”定义了一个规则


您的脚本用什么语言进行解析?在我看来,被扫描的语言是Java,但扫描的是什么?根据您的平台和regex选项,一些成功/失败示例可能会更好。可能不匹配\n。因此,您似乎在查找文本,后跟\n*,然后不是“stackTrace”,后跟文本,然后是\n*。我想您指的是包含\n的文本部分。所以对我来说,似乎你需要说一些类似“{[.\n]*(?!stackTrace)[.\n]*}除非代码是机器生成的,否则用简单的正则表达式编写任何令人满意的代码的希望都很渺茫。事实上,完整的解决方案必须包括Java解析器。没有正则表达式可以让您百分之百满意,因为正则表达式不能对括号进行配对,所以您必须接受一些误报,因为StackTrace字符串出现在嵌套之后ed block。如果catch块中有大括号怎么办?那么使用regex会有问题,因为使用regex无法平衡大括号(或任何相关内容)。这是其表达能力的基础。因此,如果您还想分析它,您需要一些更强大的东西,如上下文无关语法。@NullUserExceptionఠ_ఠ: 我刚刚为Wonder要求的问题创建了一个正则表达式。你是对的-它不会在{}中使用额外的括号。这让我又找到了4个(从66到71),但它仍然缺少这个“catch(NameNotFoundException e){\n\n\t}”(这是一个空括号,有3条特征线)@Wonder:哎呀,我错过了“不”这个小词……我会努力的这就是我最后要做的
} catch (NameNotFoundException e) {

    }
} catch (JSONException e) {
        }
catch\s*\([^)]*\)[^{]*\{[^}]*StackTrace[^}]*\}