如果代码块包含特定字符串,则在正则表达式中实施否定先行以排除代码块

Implementing a Negative Lookahead in Regex to exclude a block of code if it contains a certain string

这是对我发布的原始问题 的跟进,但如果能帮助我稍微扩展它的功能,我将不胜感激。我尝试从中捕获以下字符串(我们称之为输出):

ltm pool TEST_POOL { 
    Some strings
    above headers
    records { 
        baz:1 {
            ANY STRING
            HERE
            session-status enabled
        } 
        foobar:23 { 
            ALSO ANY
            STRING HERE
            session-status enabled
        }
    }
    members {
        qux:45 {
            ALSO ANY
            STRINGS HERE
            session-status enabled
        }
        bash:2 {
            AND ANY
            STRING HERE
            session-status user-disabled
        }
        topaz:789 {
            AND ANY
            STRING HERE
            session-status enabled
        }        
    }
    Some strings
    below headers
}

考虑每行输出由一个典型的换行符分隔。为了这个问题,让我们将recordsmembers称为"titles"和bazfoobarquxbashtopaz 为 "headers"。我正在尝试在 Java 中制定一个正则表达式,它将捕获给定标题括号之间的所有 header,除了那些在它们自己的 header 括号之间包含字符串 session-status user-disabled 的内容如上所示。例如,假设我们要使用以下代码查找所有 header 的标题 members

String regex = "(?:\bmembers\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)";
final Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

输出应该只是...

qux
topaz

因此,它应该排除 bash header,因为它的括号之间有 session-status user-disabled。我在用于实现此目的的正则表达式中实现负前瞻时遇到问题。此外,bazfoobar 也不应该匹配,因为它们一起包含在不同的 "title" 的括号内。可以有任意数量的标题和任意数量的 header。在修改我的正则表达式以包含解决此问题的负面前瞻方面的一些帮助将不胜感激。

我在您之前的表达式的基础上添加了一个替代项,如果它包含字符串 session-status user-disabled,它将尝试使用 non-capturing 组匹配任何 "header"。这样做时,那些 "headers" 将被否定,因为它们没有被捕获。仅匹配 "headers" 中包含字符串 session-status enabled 的标题。

Example Here

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