首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Regex捕获列表中的标头

使用Regex捕获列表中的标头
EN

Stack Overflow用户
提问于 2015-12-16 19:44:15
回答 1查看 80关注 0票数 0

我尝试从其中捕获以下字符串(让我们称它为output):

代码语言:javascript
运行
复制
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称为“title”,将bazfoobarquxbashtopaz称为"headers“。我试图在Java中制定一个正则表达式,它将捕获find循环中给定标题括号之间的所有标头。例如,假设我们希望用以下代码查找标题的所有标题members

代码语言:javascript
运行
复制
        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));
        }

输出应该是..。

代码语言:javascript
运行
复制
qux
bash
topaz

并且应该排除bazfoobar,因为它们包含在不同的“标题”的括号中。可以有任意数量的标题和任意数量的标题。一些帮助制定一个正则表达式来解决这个问题将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-16 19:52:43

您可以使用\G使用此正则表达式,该正则表达式断言上一次匹配结束时的位置或第一次匹配的字符串开始时的位置:

代码语言:javascript
运行
复制
(?:\bmembers\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)

或:

代码语言:javascript
运行
复制
(?:\brecords\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)

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

RegEx演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34320744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档