使用正则表达式捕获列表中的标题

时间:2015-12-16 19:44:15

标签: java regex matcher

我想要捕获以下字符串(让我们称之为syntax error, unexpected '{' on line 9 ):

output

考虑ltm pool TEST_POOL { Some strings above headers records { baz:1 { ANY STRING HERE } foobar:23 { ALSO ANY STRING HERE } } members { qux:45 { ALSO ANY STRINGS HERE } bash:2 { AND ANY STRING HERE } topaz:789 { AND ANY STRING HERE } } Some strings below headers } 的每一行由典型的换行符分隔。为了这个问题,让我们将outputrecords称为"标题"和membersbazfoobarquxbash作为"标题"。我试图在Java中制定一个正则表达式,它将捕获查找循环中给定标题的括号之间的所有标题。例如,我们想要使用以下代码查找标题topaz的所有标题:

members

输出应该是......

        String regex = TODO; // members\\s\\{ contained in regex
        final Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(output);
        while (matcher.find()) {
            System.out.println(matcher.group(1));
        }

并且应该排除qux bash topaz baz,因为它们包含在不同的"标题"的括号内。可以有任意数量的标题和任意数量的标题。一些帮助制定正则表达式来解决这个问题将非常感激。

1 个答案:

答案 0 :(得分:1)

你可以使用\G使用这个正则表达式来断言上一场比赛结束时的位置或第一场比赛的字符串开头:

(?:\bmembers\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)

OR:

(?:\brecords\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)

这是假设没有嵌套和转义{}

RegEx Demo