使用正则表达式捕获列表中的多个元素

时间:2015-10-28 14:55:09

标签: java regex

我有一个字符串output,我试图捕获使用正则表达式匹配的项目列表。字符串如下......

ltm virtual test_vs {
    profiles {
        foo_bar {
            context all
        }
        baz {
            context one
        }
        qux {
            context all
        }
    }
}

我想要做的是提出一个与整个字符串匹配的正则表达式,并从中捕获foo_barbazqux,而不知道其中的值这些捕获事先。此外,我希望它具有灵活性,因为可以捕获任意数量的项目;它们将始终位于profiles括号之间,每个括号中都有context ANYWORD括号内的开括号和闭括号。到目前为止我所拥有的是......

List<String> itemList = new ArrayList<>();
regex = "ltm\\svirtual\\stest_vs\\s\\{\\s*\\n\\s*profiles\\s\\{"+TODO;
pattern = Pattern.compile(regex);
matcher = pattern.matcher(output);
while(matcher.find()) {
    itemList.add(matcher.group(1));
}

只需要一些帮助填写regex的其余部分。建议?

2 个答案:

答案 0 :(得分:1)

你可以使用这个基于\G的正则表达式来断言上一场比赛结束时的位置或第一场比赛的字符串开头:

String regex = "(?:\\bprofiles\\s*\\{|(?<!^)\\G)[^{]+?(\\b\\w+\\b)\\s*\\{[^}]*}";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(output);

List<String> itemList = new ArrayList<>();
while(matcher.find()) {
    itemList.add(matcher.group(1));
}

RegEx Demo

答案 1 :(得分:0)

([^\\s]+)\\s+\\{\\n\\s*context\\s如果输入真的很简单。然而,很多事情都可能出错,例如如果其中一个配置文件被调用&#34; context&#34;。

否则,解析它(作为JSON或编写自己的解析器)可能更好,而不是使用正则表达式。