我想要捕获以下字符串(让我们称之为syntax error, unexpected '{' on line 9
):
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
和records
称为"标题"和members
,baz
,foobar
,qux
和bash
作为"标题"。我试图在Java中制定一个正则表达式,它将捕获查找循环中给定标题的括号之间的所有标题。例如,我们想要使用以下代码查找标题topaz
的所有标题:
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
和baz
,因为它们包含在不同的"标题"的括号内。可以有任意数量的标题和任意数量的标题。一些帮助制定正则表达式来解决这个问题将非常感激。
答案 0 :(得分:1)
你可以使用\G
使用这个正则表达式来断言上一场比赛结束时的位置或第一场比赛的字符串开头:
(?:\bmembers\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)
OR:
(?:\brecords\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)
这是假设没有嵌套和转义{
和}
。