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));
}
}
}
答案 0 :(得分:2)
您可以使用lookarounds来解决您的问题,这样您的正则表达式就是
(?<=program|function|process)[^{]*\\{(.*?)\\}\\s*(?=program|function|process|$)
第1组会有您的数据..