/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
String input
= "Jim ate a [sandwich] with [pickles] and [dried [onions]] and ] [an[other] match]"; List<String> balanced = getBalancedSubstrings(input, '[', ']', true);
System.
out.
println("Balanced ones: " + balanced
); List<String> rx_split = new ArrayList<String>();
for (String item
: balanced
) { rx_split.add("\\s*" + Pattern.quote(item) + "\\s*");
}
System.
out.
println("In-betweens: " + Arrays.
toString(input.
split(rx
))); }
List<String> subTreeList = new ArrayList<String>();
int level = 0;
int lastOpenBracket = -1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == markStart) {
level++;
if (level == 1) {
lastOpenBracket = (includeMarkers ? i : i+1);
}
}
else if (c == markEnd) {
if (level == 1) {
subTreeList.add(s.substring(lastOpenBracket, (includeMarkers ? i+1 : i)));
}
if (level > 0) level--;
}
}
return subTreeList;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlTdHJpbmcgaW5wdXQgPSAiSmltIGF0ZSBhIFtzYW5kd2ljaF0gd2l0aCBbcGlja2xlc10gYW5kIFtkcmllZCBbb25pb25zXV0gYW5kIF0gW2FuW290aGVyXSBtYXRjaF0iOwoJCUxpc3Q8U3RyaW5nPiBiYWxhbmNlZCA9IGdldEJhbGFuY2VkU3Vic3RyaW5ncyhpbnB1dCwgJ1snLCAnXScsIHRydWUpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiQmFsYW5jZWQgb25lczogIiArIGJhbGFuY2VkKTsKCQlMaXN0PFN0cmluZz4gcnhfc3BsaXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKCQlmb3IgKFN0cmluZyBpdGVtIDogYmFsYW5jZWQpIHsKICAgCQkJcnhfc3BsaXQuYWRkKCJcXHMqIiArIFBhdHRlcm4ucXVvdGUoaXRlbSkgKyAiXFxzKiIpOwogCQl9CiAJCVN0cmluZyByeCA9IFN0cmluZy5qb2luKCJ8Iiwgcnhfc3BsaXQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4tYmV0d2VlbnM6ICIgKyBBcnJheXMudG9TdHJpbmcoaW5wdXQuc3BsaXQocngpKSk7Cgl9CglwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRCYWxhbmNlZFN1YnN0cmluZ3MoU3RyaW5nIHMsIENoYXJhY3RlciBtYXJrU3RhcnQsIENoYXJhY3RlciBtYXJrRW5kLCBCb29sZWFuIGluY2x1ZGVNYXJrZXJzKSB7CgkJTGlzdDxTdHJpbmc+IHN1YlRyZWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CgkJaW50IGxldmVsID0gMDsKCQlpbnQgbGFzdE9wZW5CcmFja2V0ID0gLTE7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKICAgIAkJY2hhciBjID0gcy5jaGFyQXQoaSk7CiAgICAJCWlmIChjID09IG1hcmtTdGFydCkgewogICAgICAgIAkJbGV2ZWwrKzsKICAgICAgICAJCWlmIChsZXZlbCA9PSAxKSB7CiAgICAgICAgICAgIAkJbGFzdE9wZW5CcmFja2V0ID0gKGluY2x1ZGVNYXJrZXJzID8gaSA6IGkrMSk7CiAgICAgICAgCQl9CiAgICAJCX0KICAgIAkJZWxzZSBpZiAoYyA9PSBtYXJrRW5kKSB7CiAgICAgICAgCQlpZiAobGV2ZWwgPT0gMSkgewogICAgICAgICAgICAJCXN1YlRyZWVMaXN0LmFkZChzLnN1YnN0cmluZyhsYXN0T3BlbkJyYWNrZXQsIChpbmNsdWRlTWFya2VycyA/IGkrMSA6IGkpKSk7CiAgICAgICAgCQl9CiAgICAgICAgCQlpZiAobGV2ZWwgPiAwKSBsZXZlbC0tOwogICAgCQl9CgkJfQoJCXJldHVybiBzdWJUcmVlTGlzdDsKCX0KfQ==