java - 在正则表达式中实现负向先行以排除包含特定字符串的代码块

标签 java regex matcher regex-lookarounds

这是我发布的原始问题 here 的后续问题,但我希望能帮助扩大其功能。我试图从中捕获以下字符串(我们称之为输出):

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 作为“ header ”。我正在尝试在Java中制定一个正则表达式,它将捕获给定标题的括号之间的所有标题,除了那些在自己的标题括号之间包含字符串 session-status user-disabled 的标题,如上所示。例如,假设我们想要使用以下代码查找标题 members 的所有 header :

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 也不应该匹配,因为它们一起包含在不同“标题”的括号内。可以有任意数量的标题和任意数量的标题。修改我的正则表达式以包含负向前瞻来解决此问题的一些帮助将非常感激。

最佳答案

我在之前的表达式的基础上添加了一个替代项,如果它包含字符串session-status user-disabled,则该替代项将尝试使用非捕获组来匹配任何“ header ”。这样做时,这些“ header ”将被否定,因为它们未被捕获。仅包含字符串 session-statusenabled 的“headers”标题才会匹配。

Example Here

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

关于java - 在正则表达式中实现负向先行以排除包含特定字符串的代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34338301/

相关文章:

java - 当表有八列时,在数据库条目中搜索匹配项

c# - 正则表达式来获取样本的特定部分

java - Matcher.appendEvaluated() 上出现 NullPointerException?

java - 获取具有特定前缀的整数 [Java]

Java 查找 Long 的集合位

java - java中类方法和类变量属于类对象吗?

java - 在 Android 中读取和显示大格式文本文档

c# - 如何将正则表达式与 javascript 中的谷歌搜索更正字符串相匹配

java - gradle基于复制创建新的java类

java - Mockito 不允许 Matchers.any() 与 Integer.class