使用正则表达式在列表中捕获 Headers

Capturing Headers in a List Using Regex

我试图从中捕获以下字符串(我们称之为 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
}

考虑 output 的每一行由一个典型的换行符分隔。为了这个问题,我们把recordsmembers称为"titles"和bazfoobarquxbashtopaz 为 "headers"。我正在尝试在 Java 中制定一个正则表达式,它将捕获查找循环中给定标题括号之间的所有 headers。例如,假设我们要使用此代码查找标题 members 的所有 headers:

        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

并且应该排除bazfoobar,因为它们包含在不同的"title"的括号内。可以有任意数量的标题和任意数量的 headers。如果您能帮助制定正则表达式来解决此问题,我们将不胜感激。

您可以使用此正则表达式 \G 断言位置在上一个匹配项的末尾或第一个匹配项的字符串的开头:

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

或:

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

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

RegEx Demo