Иногда проще сопоставить то, что вы хотите, а не то, что вы не хотите:
String s = "\"Thanks,\", \"in advance,\", \"for(\"the\", \"help\")\"";
String regex = "\"(\\([^)]*\\)|[^\"])*\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(s.substring(m.start(),m.end()));
}
Выход:
"Thanks,"
"in advance,"
"for("the", "help")"
Если вам также нужно игнорировать закрывающие скобки внутри разделов кавычек, которые находятся внутри скобок, то вам нужно это:
String regex = "\"(\\((\"[^\"]*\"|[^)])*\\)|[^\"])*\"";
Пример строки, которая нуждается во второй, более сложной версии:
"foo","bar","baz(":-)",":-o")"
Выход:
"foo"
"bar"
"baz(":-)",":-o")"
Однако я бы посоветовал вам изменить формат данных, если это возможно. Это было бы намного проще, если бы вы использовали стандартный формат, такой как XML, для хранения своих токенов.