正则表达式在源代码中查找if或while语句

时间:2014-11-30 04:10:07

标签: java regex

我正在尝试创建一个正则表达式,它能够识别某些源代码的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;
}   

0 个答案:

没有答案