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

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

process C {
    more code;
}

我想提取program,functionprocess. 在输出方面,我想看到三个匹配项:

       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));
        }
    }
}
4

1 回答 1

2

您可以通过使用环视来解决您的问题..所以您的正则表达式将是

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

第 1 组将有您的数据..

于 2013-01-27T06:16:22.287 回答