import java.util.*;
import java.util.regex.*;
class Test
{
{
int offset = (includeMarkers ? -1 : 0);
String s
= "Some Garbage text\r\nltm virtual The_Name_51244_sdfasfdasd {\r\n address-status yes\r\n enabled\r\n fallback-persistence none\r\n profiles {\r\n /Common/GLOBAL_PROFILE {\r\n context all\r\n }\r\n /Common/http {\r\n context all\r\n }\r\n }\r\n rate-class none\r\n rules {\r\n /Common/X-F-F\r\n }\r\n log-profiles none\r\n source-address-translation {\r\n pool SOME-SNAT-POOL\r\n type snat\r\n }\r\n source-port preserve\r\n vlans {\r\n Vlan1111\r\n }\r\n service-down-immediate-action none\r\n service-policy none\r\n source 0.0.0.0/0\r\n}\r\nbarbage text\r\nltm virtual The_Object_51244 {\r\n address-status yes\r\n enabled\r\n fallback-persistence none\r\n profiles {\r\n /Common/GLOBAL_PROFILE {\r\n context all\r\n }\r\n /Common/http {\r\n context all\r\n }\r\n }\r\n rate-class none\r\n rules {\r\n /Common/X-F-F\r\n }\r\n log-profiles none\r\n source-address-translation {\r\n pool SOME-SNAT-POOL\r\n type snat\r\n }\r\n source-port preserve\r\n vlans {\r\n Vlan2222\r\n }\r\n service-down-immediate-action none\r\n service-policy none\r\n source 0.0.0.0/0\r\n}\r\nTrailing garbage text"; Pattern patternBefore = Pattern.compile("(ltm\\s+virtual)\\s+([\\w-]+)\\s+" + Pattern.quote(markStart.toString()));
Matcher m = patternBefore.matcher(s);
while (m.find()) {
System.
out.
println("Group 1: " + m.
group(1)); System.
out.
println("Group 2: " + m.
group(2)); String res
= getBalancedSubstring
(s.
substring(m.
end()), markStart, markEnd, includeMarkers
);
System.
out.
println("Found nested: " + res
+ "\n----"); if (res == null) {
System.
out.
println("No nested parens match found, this match must be failed."); }
else {
s = s.substring(m.end()+res.length() + offset);
m.reset(s);
}
}
}
{
int level = 1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == markStart) {
level++;
}
else if (c == markEnd) {
if (level == 1) {
return (includeMarkers ? markStart.toString() : "") + s.substring(0, (includeMarkers ? i + 1 : i));
}
if (level > 0) level--;
}
}
return null;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7CgpjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCUNoYXJhY3RlciBtYXJrU3RhcnQgPSAneyc7CgkJQ2hhcmFjdGVyIG1hcmtFbmQgPSAnfSc7CgkJQm9vbGVhbiBpbmNsdWRlTWFya2VycyA9IHRydWU7CgkJaW50IG9mZnNldCA9IChpbmNsdWRlTWFya2VycyA/IC0xIDogMCk7CgkJU3RyaW5nIHMgPSAiU29tZSBHYXJiYWdlIHRleHRcclxubHRtIHZpcnR1YWwgVGhlX05hbWVfNTEyNDRfc2RmYXNmZGFzZCB7XHJcbiAgICBhZGRyZXNzLXN0YXR1cyB5ZXNcclxuICAgIGVuYWJsZWRcclxuICAgIGZhbGxiYWNrLXBlcnNpc3RlbmNlIG5vbmVcclxuICAgIHByb2ZpbGVzIHtcclxuICAgICAgICAvQ29tbW9uL0dMT0JBTF9QUk9GSUxFIHtcclxuICAgICAgICAgICAgY29udGV4dCBhbGxcclxuICAgICAgICB9XHJcbiAgICAgICAgL0NvbW1vbi9odHRwIHtcclxuICAgICAgICAgICAgY29udGV4dCBhbGxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByYXRlLWNsYXNzIG5vbmVcclxuICAgIHJ1bGVzIHtcclxuICAgICAgICAvQ29tbW9uL1gtRi1GXHJcbiAgICB9XHJcbiAgICBsb2ctcHJvZmlsZXMgbm9uZVxyXG4gICAgc291cmNlLWFkZHJlc3MtdHJhbnNsYXRpb24ge1xyXG4gICAgICAgIHBvb2wgU09NRS1TTkFULVBPT0xcclxuICAgICAgICB0eXBlIHNuYXRcclxuICAgIH1cclxuICAgIHNvdXJjZS1wb3J0IHByZXNlcnZlXHJcbiAgICB2bGFucyB7XHJcbiAgICAgICAgVmxhbjExMTFcclxuICAgIH1cclxuICAgIHNlcnZpY2UtZG93bi1pbW1lZGlhdGUtYWN0aW9uIG5vbmVcclxuICAgIHNlcnZpY2UtcG9saWN5IG5vbmVcclxuICAgIHNvdXJjZSAwLjAuMC4wLzBcclxufVxyXG5iYXJiYWdlIHRleHRcclxubHRtIHZpcnR1YWwgVGhlX09iamVjdF81MTI0NCB7XHJcbiAgICBhZGRyZXNzLXN0YXR1cyB5ZXNcclxuICAgIGVuYWJsZWRcclxuICAgIGZhbGxiYWNrLXBlcnNpc3RlbmNlIG5vbmVcclxuICAgIHByb2ZpbGVzIHtcclxuICAgICAgICAvQ29tbW9uL0dMT0JBTF9QUk9GSUxFIHtcclxuICAgICAgICAgICAgY29udGV4dCBhbGxcclxuICAgICAgICB9XHJcbiAgICAgICAgL0NvbW1vbi9odHRwIHtcclxuICAgICAgICAgICAgY29udGV4dCBhbGxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByYXRlLWNsYXNzIG5vbmVcclxuICAgIHJ1bGVzIHtcclxuICAgICAgICAvQ29tbW9uL1gtRi1GXHJcbiAgICB9XHJcbiAgICBsb2ctcHJvZmlsZXMgbm9uZVxyXG4gICAgc291cmNlLWFkZHJlc3MtdHJhbnNsYXRpb24ge1xyXG4gICAgICAgIHBvb2wgU09NRS1TTkFULVBPT0xcclxuICAgICAgICB0eXBlIHNuYXRcclxuICAgIH1cclxuICAgIHNvdXJjZS1wb3J0IHByZXNlcnZlXHJcbiAgICB2bGFucyB7XHJcbiAgICAgICAgVmxhbjIyMjJcclxuICAgIH1cclxuICAgIHNlcnZpY2UtZG93bi1pbW1lZGlhdGUtYWN0aW9uIG5vbmVcclxuICAgIHNlcnZpY2UtcG9saWN5IG5vbmVcclxuICAgIHNvdXJjZSAwLjAuMC4wLzBcclxufVxyXG5UcmFpbGluZyBnYXJiYWdlIHRleHQiOwoJCVBhdHRlcm4gcGF0dGVybkJlZm9yZSA9IFBhdHRlcm4uY29tcGlsZSgiKGx0bVxccyt2aXJ0dWFsKVxccysoW1xcdy1dKylcXHMrIiArIFBhdHRlcm4ucXVvdGUobWFya1N0YXJ0LnRvU3RyaW5nKCkpKTsKCQkKCQlNYXRjaGVyIG0gPSBwYXR0ZXJuQmVmb3JlLm1hdGNoZXIocyk7CgkJd2hpbGUgKG0uZmluZCgpKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiR3JvdXAgMTogIiArIG0uZ3JvdXAoMSkpOwoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdyb3VwIDI6ICIgKyBtLmdyb3VwKDIpKTsKCQkJU3RyaW5nIHJlcyA9IGdldEJhbGFuY2VkU3Vic3RyaW5nKHMuc3Vic3RyaW5nKG0uZW5kKCkpLCBtYXJrU3RhcnQsIG1hcmtFbmQsIGluY2x1ZGVNYXJrZXJzKTsKCQkJCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgbmVzdGVkOiAiICsgcmVzICsgIlxuLS0tLSIpOwoJCQlpZiAocmVzID09IG51bGwpIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gbmVzdGVkIHBhcmVucyBtYXRjaCBmb3VuZCwgdGhpcyBtYXRjaCBtdXN0IGJlIGZhaWxlZC4iKTsKCQkJfQoJCQllbHNlIHsKCQkJCXMgPSBzLnN1YnN0cmluZyhtLmVuZCgpK3Jlcy5sZW5ndGgoKSArIG9mZnNldCk7CgkJCQltLnJlc2V0KHMpOwoJCQl9CgkJfQoJfQoJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFsYW5jZWRTdWJzdHJpbmcoU3RyaW5nIHMsIENoYXJhY3RlciBtYXJrU3RhcnQsIENoYXJhY3RlciBtYXJrRW5kLCBCb29sZWFuIGluY2x1ZGVNYXJrZXJzKSAKCXsKCSAgICBpbnQgbGV2ZWwgPSAxOwoJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CgkgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwoJICAgICAgICBpZiAoYyA9PSBtYXJrU3RhcnQpIHsKCSAgICAgICAgICAgIGxldmVsKys7CgkgICAgICAgIH0KCSAgICAgICAgZWxzZSBpZiAoYyA9PSBtYXJrRW5kKSB7CgkgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMSkgewoJICAgICAgICAgICAgICAgIHJldHVybiAoaW5jbHVkZU1hcmtlcnMgPyBtYXJrU3RhcnQudG9TdHJpbmcoKSA6ICIiKSArIHMuc3Vic3RyaW5nKDAsIChpbmNsdWRlTWFya2VycyA/IGkgKyAxIDogaSkpOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwtLTsKCSAgICAgICAgfQoJICAgIH0KCSAgICByZXR1cm4gbnVsbDsKICAgIH0KfQ==