我正在审查Java代码,要检查的类太多了,我进行了正则表达式来查找用Java编写的方法,该方法不会在finally块内关闭IO流。
(?s)(?<=public|private|protected).
(?<!finally).*?.close\(\)\;
由于某种原因,这不起作用,甚至与那些最终阻塞的方法都匹配,因此也可以找到以下内容
public testMethod(){
InputStream stream = .....
try{
//do something
} finally {
if(stream != null){
stream.close();
}
}
}
虽然仅以下内容应匹配
public testMethod(){
InputStream stream = .....
//do something
if(stream != null){
stream.close();
}
}
有指针吗?
你或许正则表达式应该是:(?s)(?<=public|private|protected)((?!finally).)*close\(\)\;
。regex101上的演示。
说明:((?!finally).)*
验证字符串的其余部分不包含finally
。
注意:为了涵盖所有情况,您可能还需要检查,如果它们close()
确实在finally的块内。您可以使用类似的表达式来实现(?s)(?<=public|private|protected)((?!finally[^}]*close\(\)\;).)*close\(\)\;
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句