【问题标题】:Capturing Headers in a List Using Regex使用正则表达式捕获列表中的标题
【发布时间】:2015-12-16 19:44:15
【问题描述】:

我试图从中捕获以下字符串(我们称之为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 称为“标题”,将bazfoobarquxbashtopaz 称为“标题”。我正在尝试在 Java 中制定一个正则表达式,它将在查找循环中捕获给定标题括号之间的所有标题。例如,假设我们要使用以下代码查找标题 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

并且应该排除bazfoobar,因为它们包含在不同“标题”的括号内。可以有任意数量的标题和任意数量的标题。对于制定正则表达式来解决此问题的一些帮助将不胜感激。

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

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

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

    或者:

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

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

    RegEx Demo

    【讨论】:

    • 嗯,但似乎如果我将 member 更改为 records 它不再捕获任何内容。可以对此进行更改以适应这种情况吗?
    • 谢谢。如果你不认为这个问题完全是犯罪,你介意用赞成票来取消反对它的反对票吗?我永远不会理解那些不加评论就拒绝投票的人。
    • 即使我不明白为什么它被否决了,我还是投了赞成票。
    • 真的很抱歉给您带来不便,但是如果我稍微扩展我的问题以包括不匹配在括号内包含给定字符串的标题(ANY STRINGS HERE 部分),您能否修改您的答案占那个?我自己很难破解它,我绝对不想不接受你的回答,所以我想在编辑问题或创建新问题之前先在这里直接问你。谢谢!
    • 好的,谢谢。我在这里发布了我的新问题:stackoverflow.com/questions/34338301/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多