program A {
int x = 10;
tuple date {
int day;
int month;
int year;
}
}
function B {
int y = 20;
...
}
process C {
more code;
}
我想提取program
,function
和process
. 在输出方面,我想看到三个匹配项:
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 中使用相同的表达式时,它就不再起作用了。它只返回第一个匹配项。我有一个模糊的记忆,上一次匹配中消耗的文本将不会再次匹配。在我的情况下,关键字program
和function
已在第一次匹配中被消耗,导致没有进一步的匹配。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));
}
}
}