在Java中再次启用先前使用的文本

时间:2013-01-27 06:00:16

标签: java regex

program A {
   int x = 10;
   tuple date {
            int day;
            int month;
            int year;
   }
}

function B {
    int y = 20;
    ...
}

process C {
    more code;
}

我想提取programfunctionprocess的外花括号内的任何内容。就输出而言,我希望看到三个匹配:

       int x = 10;
       tuple date {
                int day;
                int month;
                int year;
       } //first match

       int y = 20;
       ... //second match

       more code; //third match

我用Javascript实现了这一点。我使用的正则表达式是/(program|function|process).*?{(.*?)}\n+(program|function|process)/m,其工作原理如Rubular所示。

然而,当我在Java中使用相同的表达式时,它将不再起作用。它只返回第一场比赛。我有一个模糊的记忆,以前的比赛中消耗的文字不会再次匹配。在我的情况下,关键字programfunction已在第一场比赛中消耗,导致没有进一步的匹配。 Java中有没有一种方法可以匹配消费的文本?

编辑:Java代码按要求发布在下面。

public class Test {
    public static void main(String[] args) throws IOException {
        String input = FileUtils.readFileToString(new File("input.txt"));
        Pattern p = Pattern.compile("(program|function|process)[^\\{]*?\\{(.*?)\\}\\s*(program|function|process)", Pattern.DOTALL);
        Matcher m = p.matcher(input);
        while(m.find()) {
            System.out.println(m.group(2));
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用lookarounds来解决您的问题,这样您的正则表达式就是

(?<=program|function|process)[^{]*\\{(.*?)\\}\\s*(?=program|function|process|$) 

第1组会有您的数据..