2
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。出力に関しては、次の3つの一致を見たいと思います。

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

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

       more code; //third match

私はJavascriptを使用してこれを達成しました。私が使用する正規表現はです。これは、 Rubular/(program|function|process).*?{(.*?)}\n+(program|function|process)/mで示されているように機能します。

ただし、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 に答える