我正在尝试创建一个正则表达式,它能够识别某些源代码的String表示中的if和while语句。然后我将使用正则表达式来反转与此语句关联的布尔条件,方法是在Java中使用String.replace()函数插入“!(”和“)”。
正则表达式应该能够识别if和while语句,而不管语句块的使用情况,条件有多少部分或条件如何“嵌套”。
换句话说,正则表达式应该识别以下所有语句:
if(true)
function();
if(true){
function();
}
if((true && thing.isEmpty() || i > 2){
function();
}
if((true && thing.isEmpty()
|| i > 2){
function();
}
(依此类推,包括等效的while语句)
我能够提出一个似乎适用于使用语句块的ifs和whiles的正则表达式:
"(if|while)[\\s]*[\\(]([^\\{])*\\{"
不幸的是,这个问题是,如果我正在处理的代码有if或while不使用块,那么正则表达式的([^ \\ {])*部分会吸收所有内容,直到它找到下一个\\}。
这是我到目前为止的代码:
private static int negateBool(File inFile, File outFile, int numMuts){
// establish character counter
int charCounter = -1;
try{
// set up the output
if(!outFile.exists()){
outFile.createNewFile();
}
PrintWriter fileOut = new PrintWriter(new FileWriter(outFile.getPath()));
// convert input file into a string
Scanner scanner = new Scanner(inFile);
String content = scanner.useDelimiter("\\Z").next();
scanner.close();
String regex = "(if|while)[\\s]*([^\\{]*)\\{";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
int intCounter = numMuts;
while(matcher.find() && intCounter > -1){ // if a potential mutation has been found
System.out.println("ping");
if(intCounter > 0){ // if this mutation has been done already
intCounter--;
}
else{ // a new mutation has been found, intCounter == 0
charCounter = matcher.start(1);
// do the mutation
fileOut.write(content.substring(0,matcher.start(1)));
String part = content.substring(matcher.start(1), matcher.end(0));
part = part.replaceFirst(regex, "$1(!$2){");
fileOut.write(part);
fileOut.write(content.substring(matcher.end(0), content.length()));
intCounter = -1;
}
}
fileOut.close();
}catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return charCounter;
}