我正在审查java代码,有很多类要检查,我做了一个正则表达式 找到一个用java编写的方法,它不会在finally块中关闭IO流。
(?s)(?<=public|private|protected).
(?<!finally).*?.close\(\)\;
由于某些原因,这不起作用,它甚至匹配那些最终阻止的方法,所以下面也找到了
(?<!finally).*?.close\(\)\;
虽然只有下面应匹配
public testMethod(){
InputStream stream = .....
try{
//do something
} finally {
if(stream != null){
stream.close();
}
}
}
任何指针?
答案 0 :(得分:1)
你的正则表达式应该是:(?s)(?<=public|private|protected)((?!finally).)*close\(\)\;
。在regex101上演示。
解释:((?!finally).)*
验证字符串的其余部分是否包含finally
。
注意:为了涵盖所有情况,您可能还想检查close()
是否实际位于finally块中。您可以使用(?s)(?<=public|private|protected)((?!finally[^}]*close\(\)\;).)*close\(\)\;
等表达式来执行此操作。