我尝试从其中捕获以下字符串(让我们称它为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
称为“title”,将baz
、foobar
、qux
、bash
和topaz
称为"headers“。我试图在Java中制定一个正则表达式,它将捕获find循环中给定标题括号之间的所有标头。例如,假设我们希望用以下代码查找标题的所有标题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
和foobar
,因为它们包含在不同的“标题”的括号中。可以有任意数量的标题和任意数量的标题。一些帮助制定一个正则表达式来解决这个问题将是非常感谢的。
发布于 2015-12-16 19:52:43
您可以使用\G
使用此正则表达式,该正则表达式断言上一次匹配结束时的位置或第一次匹配的字符串开始时的位置:
(?:\bmembers\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)
或:
(?:\brecords\s*\{|(?<!^)\G[^{]+\{[^}]+\})\s*?\n\s*([^:{}]+)(?=:\d)
这是假设没有嵌套和转义的{
和}
。
https://stackoverflow.com/questions/34320744
复制相似问题